【问题标题】:How to create the smallest possible transparent png/gif of a given size in PHP?如何在 PHP 中创建给定大小的最小可能透明 png/gif?
【发布时间】:2016-10-13 14:31:36
【问题描述】:

我已经编写了这段代码来为给定大小的透明 PNG 生成 data-uri:

function createTransparentDataURI($w = 1, $h = 1) {

    // Enable output buffering
    ob_start();

    $img = imagecreatetruecolor($w, $h);
    imagesavealpha($img, true);
    $color = imagecolorallocatealpha($img, 0, 0, 0, 127);
    imagefill($img, 0, 0, $color);
    imagepng($img);
    imagedestroy($img);

    // Capture the output
    $imagedata = ob_get_contents();
    // Clear the output buffer
    ob_end_clean();

    // REF: http://stackoverflow.com/questions/9370847/php-create-image-with-imagepng-and-convert-with-base64-encode-in-a-single-file
    return 'data:image/png;base64,' . base64_encode($imagedata);
}

使用

运行的示例
echo createTransparentDataURI(1016, 312);

返回

数据:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAA / gAAAE4CAYAAADvrFgKAAAE40lEQVR4nO3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwZltVAAEv7IggAAAAAElFTkSuQmCC P>

有没有办法“压缩”(PNG 是无损的,但有压缩选项?)这个 data-uri 具有更好的编码或使用单色 GIF?使用 PHP 编程图形不是我最擅长的领域。

【问题讨论】:

  • 这是个好消息。您的原始 PNG 为 1308 字节,但只需使用 Photoshop 将其重新保存为 2 色 GIF 即可将大小降至 918 字节,甚至更好的是,将其重新保存为 2 色 PNG 可将其缩小至仅 459字节。 (这包括一个 37 字节的标记,尽管我特别告诉 PS 不要保存它。)一个明显的第一个优化是将您的图像创建为“32-位 RGB+alpha”,但颜色深度较低。
  • @RadLexus 很高兴知道可以缩小尺寸。这些虚拟图像正在即时制作/缓存,以便与一些最终的 HTML 内联。它们必须在没有 CLI 的情况下在 PHP 中完成。有什么建议可以修改我的问题中的代码吗?

标签: php image-processing png gif


【解决方案1】:

考虑到图像将是透明的并且不会出现任何内容,因此您不需要它是无损的。这意味着您可以使用单一颜色的调色板,该调色板将为该颜色创建索引并将索引用于图像中的所有像素。要创建索引调色板 PNG,您应该在代码中使用 imagetruecolortopalette() 函数:http://php.net/manual/en/function.imagetruecolortopalette.php

您还可以将图像压缩级别设置为最高。

function createTransparentDataURI($w = 1, $h = 1) {
    //...
    //create image palette with one color, the dithering (the second argument) doesn't matter here
    imagetruecolortopalette($img, false, 1);
    imagepng($img, null, 9); //set the compression level to highest
    //...
}

这将图像 1016x312 的数据长度从 1308 字节减少到 133 字节,几乎是原来的 10 倍。

通过将二进制数据转换为base64,您可以用肉眼看到还有压缩空间:

iVBORw0KGgoAAAANSUhEUgAAA/gAAAE4AQMAAADVYspJAAAAA1BMVEUEAgSVKDOdAAAAPUlEQVR42u3BAQ0AAADCoPdPbQ8HFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/BicAAABWZX81AAAAABJRU5ErkJggg==

多个“A”在哪里

您可以启用 http 的服务器 gzip 压缩,以进一步压缩此响应。

GIF 不会做得更好,因为在我的测试中它的大小是 910 字节。

【讨论】:

  • 绝对漂亮!它就像一个魅力。非常感谢。
猜你喜欢
  • 2014-06-03
  • 2010-09-21
  • 2015-09-22
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 2013-03-09
相关资源
最近更新 更多