为了账号安全,请及时绑定邮箱和手机立即绑定

带有透明PNG的imagetruecolortopalette的PHP错误结果

带有透明PNG的imagetruecolortopalette的PHP错误结果

PHP
撒科打诨 2022-01-14 17:28:01
我正在尝试编写一个 PHP 脚本来调整 PNG 图像的大小,然后将其转换为 PNG-8 位模式。所以生成的文件的大小会更小,但不会有太多的质量损失。调整大小效果很好,还保留了图像透明度:问题是当我将图像转换为 8 位时:imagetruecolortopalette($resizedImg, true, 255);imagealphablending($resizedImg, false);$transparent = imagecolorallocatealpha($resizedImg, 255, 255, 255, 127);if(!imagefill($resizedImg, 0, 0, $transparent)) return false;imagesavealpha($resizedImg, true);生成的图像是这样的,周围和图像内部都有一点透明度:如果我设置 256 种颜色而不是 255 种颜色:imagetruecolortopalette($resizedImg, true, 256);图像将具有黑色背景:
查看完整描述

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 命令行。


查看完整回答
反对 回复 2022-01-14
?
阿晨1998

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

PNG减少到32色

编辑 2:我更新了我的脚本并添加了可选的 Floyd-Steinberg 抖动。每个通道有 16 种颜色的结果:

Reduced to 66.94% of original, 12.1kB to 8.1kB

在此处输入图像描述

请注意,抖动也会影响文件大小,因为当相邻像素具有不同颜色时,压缩 PNG 会“更难”。


查看完整回答
反对 回复 2022-01-14
  • 2 回答
  • 0 关注
  • 280 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号