在图像上应用水印

Applying watermark on an image

我正在尝试使用以下 imagemagick 命令在图像上应用水印

convert input.png watermark.png.png -gravity northwest -composite output.png

输入的png文件大小为16KB,水印文件大小为900bytes,但是当我执行上述命令应用水印时,输出的png文件大小为61KB,几乎是原始输入png文件大小的4倍.有没有更好的方法将水印应用于图像文件,并在输出文件大小方面取得更好的结果

测试图片:https://res.cloudinary.com/deks86ilr/image/upload/v1533015495/1_rnpbye.png

测试水印:https://res.cloudinary.com/deks86ilr/image/upload/v1533015494/2_usmonh.png

这是我使用 ImageMagick 6.9.10.8 Q16 和 libpng 1.6.34 使用我的 PNG8 输出处理您的图像的结果。

我注意到您的输入图像是调色板类型,这意味着它是每像素 8 位颜色,而不是 24 位颜色。所以它已经是一个低质量的图像。

输入(~16 KB):

水印图像(透明度为白色——因此在这里不可见):

转换为 24 位 PNG:

convert input.png watermark.png -gravity northwest -compose over -composite input_with_watermark.png


我没有看到明显的可见质量损失,但输出现在从 16 KB 增加到 60 KB。但是你可以使用pngcrush等工具进一步压缩。

转换为 8 位 PNG:

convert input.png watermark.png -gravity northwest -compose over -composite PNG8:input_with_watermark2.png


文件大小现在恢复到大约 16 KB。但是正如您所注意到的,质量有点差。这可能是因为输入图像(8 位且具有 217 种颜色)首先被读回 24 位,然后加水印,其中包括新的白色阴影,然后量化回 8 位,但仅包含 84 种颜色.

另一种方法是在命令中添加 +dither -colors 256(+dither 关闭抖动):

convert 1_rnpbye.png 2_usmonh.png -gravity northwest -compose over -composite +dither -colors 256 PNG8:watermark3.png


这有点好,因为它现在使用 189 种颜色并且文件大小仍然为 16 KB。

最后一种方法是将输入的颜色保存到可着色图像中。然后使用 -remap 使用该颜色表为输出重新着色:

convert 1_rnpbye.png -unique-colors colortable.gif
convert 1_rnpbye.png 2_usmonh.png -gravity northwest -compose over -composite +dither -remap colortable.gif PNG8:watermark4.png


这会产生 227 种颜色的 8 位输出,文件大小仍然约为 16 KB。因此它比您输入的颜色多一些,并且视觉上看起来与您输入的质量大致相同。

如果您无法重现这些结果,那么也许您应该升级 ImageMagick 和 libpng 中的一个或两个。