【问题标题】:Is it possible to further compress a Base64 PNG String?是否可以进一步压缩 Base64 PNG 字符串?
【发布时间】:2012-04-03 22:21:08
【问题描述】:

我有一个 PNG 图像并获得了它的 Base64 PNG 字符串表示。它仍然很大,我想知道它是否可以进一步压缩。这可能吗?

背景

我正在使用 Selenium 2 (Java) 创建当前网页的屏幕截图,将其转换为 base64 字符串并将该字符串发送到 JavaScript 执行器以重新创建该图像并进行一些图像处理。但如果字符串太大,服务器会返回异常。

【问题讨论】:

    标签: javascript image compression base64 selenium-webdriver


    【解决方案1】:

    简单的答案:不 - 不会失去“可打印字符串”的性质

    通常 PNG 已经使用复杂的压缩,就像在 ZIP 文件中使用的一样。因此,在应用 base64 编码之前对其进行压缩只会给您带来非常有限的尺寸缩减。

    在 base64 编码之后应用压缩会再次将其转换为二进制数据 - 在这种情况下,您可以跳过 base64 编码步骤。

    【讨论】:

    • 给定原始图像数据,与base64编码相比,压缩可以提高多少?
    • Base64 将数据放大约 33%;取决于算法,良好的压缩可能会使您最多减少 10%(最大)。
    • 非常感谢。这对我的目的来说还不够,所以我必须想一个替代解决方案。也许将字符串分成多个块。
    • 我想知道您所说的“可打印字符串性质”是什么意思。能详细点吗?
    • 一个可打印的字符串只使用可打印的字符,因此很多字符不能使用。未使用的字符最终意味着未使用的位(低熵)并且不使用位与压缩相反(它试图增加最大化/优化熵)。
    【解决方案2】:

    如果是网络问题而不是字符串的大小,那么当我将图像发送到 mongo 数据库时,这对我有用。

    使用Express.jsbodyParser的限制默认为1056k 因此您可以通过如下更改限制来解决问题。

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

    【讨论】:

      【解决方案3】:

      您可以使用运行长度编码算法节省几百字节。

      例如,

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

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

      测试: expect(encode('AABBBCCCC')).toEqual('2A3B4C')

      【讨论】:

        猜你喜欢
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多