2 回答
TA贡献1864条经验 获得超2个赞
你可以在 ImageMagick 中轻松做到这一点,它分布在 Linux 上,可用于 Windows 和 Mac OSX。除了命令行之外,还有许多 API。以下是如何在 ImageMagick 命令行中执行此操作。
输入:
convert image.png PNG8:result1.png
PNG8:表示 256 色和二进制透明度。这意味着要么完全透明,要么不透明。这会导致边缘周围出现混叠(阶梯状)。如果您愿意设置背景颜色来代替透明度,那么您可以在结果中保持平滑(抗锯齿)轮廓。所以对于白色背景。
convert image.png -background white -flatten PNG8:result2.png
ImageMagick 由 PHP Imagick 运行。所以你应该可以用 PHP Imagick 做到这一点。或者您可以从 PHP exec() 调用 ImageMagick 命令行。
TA贡献2037条经验 获得超6个赞
我不认为这是奇怪的行为。
PHP 文档没有说明这一点,但我想这imagefill()与大多数其他应用程序一样:通过使用与填充开始的像素相同的颜色填充连接的像素(0, 0)。
因为您首先将托盘设置为 255 像素(或 256),所以您将所有黑暗区域转换为黑色并失去所有透明度。然后,当您从左上角开始填充填充时,所有连接的像素(也在企鹅和鸭子内部)将变得透明。
我认为没有 ImageMagick 的唯一方法是遍历调整大小图像的所有像素并将像素颜色手动设置为有限的托盘。
前段时间我写了一个小脚本来减少 PNG 的颜色,同时保留完整的 alpha 信息 (1)。这将减少 PNG 文件使用的托盘,从而减少文件大小。如果生成的 PNG 仍然超过 8 位,这并不重要。无论如何,一个小托盘会减小文件大小。
(1) https://bitbucket.org/thuijzer/pngreduce/
编辑:我刚刚使用您调整大小的 PNG(具有透明度)作为我的脚本的输入,并仅使用 32 种颜色将其从 12 kB 转换为 7 kB 文件:
Reduced to 62.28% of original, 12.1kB to 7.54kB
编辑 2:我更新了我的脚本并添加了可选的 Floyd-Steinberg 抖动。每个通道有 16 种颜色的结果:
Reduced to 66.94% of original, 12.1kB to 8.1kB
请注意,抖动也会影响文件大小,因为当相邻像素具有不同颜色时,压缩 PNG 会“更难”。
- 2 回答
- 0 关注
- 280 浏览
添加回答
举报



