Is it possible to further compress a Base64 PNG St

2019-04-07 01:18发布

问题:

I have a PNG image and got its Base64 PNG string representation. It's still quite large and i'd like to know if it can be significantly further compressed. Is that even possible?

Background

I am using Selenium 2 (Java) to create a screenshot of the current web page, convert it as base64 string and send that string to the JavaScript executor to recreate that image and do some image processing. But if that string size is too large, the server returns an Exception.

回答1:

The simple answer: No - not without loosing the "printable string" nature

Usually PNG already uses sophisticated compression like it is used in ZIP files. Therefore compressing it before applying the base64 encoding will give you only very limited size reduction.

Applying the compression after the base64 encoding will make it to binary data again - in this case you could just skip the base64 encoding step.



回答2:

If it is a problem with the network and not really the size of your string, this worked for me when I sent my images to a mongo database.

Using Express.js the limit of the bodyParser is defaulted to 1056k so you can fix the problem by changing the limit as below.

app.use(bodyParser.urlencoded({ limit: '50mb', 
  extended: true
}));
app.use(bodyParser.json({ limit: '50mb' }));


回答3:

You might save a few hundred bytes using a Run Length Encoding algorithm.

For example,

const encode = (plainText) => {
  const consecutiveChars = /([\w\s])\1*/g;
  return plainText.replace(consecutiveChars,
    match => (match.length > 1 ? match.length + match[0] : match[0]));
};

(credit: https://github.com/exercism/javascript/blob/master/exercises/run-length-encoding/example.js)

test: expect(encode('AABBBCCCC')).toEqual('2A3B4C')