image-processing - 使用 ImageMagick 通过保留半透明像素将 32 位 png 转换为 8 位 png

标签 image-processing imagemagick png transparency png-8

我想使用 ImageMagick 将 32 位 png 转换为 8 位 png,但是半透明像素丢失了。如何解决这个问题呢?我正在使用的命令如下

convert original.png PNG8:output.png

最佳答案

显然,即使 PNG 格式实际上允许 8 位索引颜色 PNG 中的任何和所有颜色完全或部分透明,ImageMagick 的“PNG8”format specifier仅支持 GIF 样式的 1 位透明度。

如果不使用 PNG8:,可以使用 ImageMagick 生成索引的 8 位 PNG。说明符,但只需使用 -colors 256-colors 255 * 减少图像中的颜色数量。不幸的是,至少根据我使用 ImageMagick 6.8.9 的测试,生成的图像有一些相当奇怪且非常难看的颜色量化伪像。

幸运的是,对于这项特定的工作,有一个更好的工具:pngquant .使用它,以最小的质量损失将 32 位 RGBA PNG 转换为 8 位颜色映射 PNG 就像:

pngquant 256 < original.png > output.png

作为快速演示,这里有一个使用各种方法转换为 8 位 PNG 的简单测试图片(带有半透明阴影的星星):

Original pngquant 256 ImageMagick convert (-colors 255) ImageMagick convert (PNG8) ImageMagick convert (-colors 255, PNG8)



从左到右:
  • 原始 32 位 RGBA PNG
  • pngquant 256 < input.png > output.png 量化
  • convert input.png -colors 255 output.png 量化*
  • convert input.png PNG8:output.png 量化
  • convert input.png -colors 255 PNG8:output.png 量化*


  • *) 在下面的评论中,建议使用 -colors 255有必要“为'背景'颜色保留一个条目。”根据我的测试,我没有观察到实际情况。使用 -colors 256仍会produce an 8-bit colormapped PNG ,量化伪影与 -colors 255 的输出在性质上相似,但在细节上有所不同。 .尽管如此,为了安全起见,我使用了 -colors 255对于上面的例子。将颜色图大小减少一种颜色本身不应显着影响结果的质量,作为对 pngquant 255 的测试。将 demonstrate .

    关于image-processing - 使用 ImageMagick 通过保留半透明像素将 32 位 png 转换为 8 位 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031965/

    相关文章:

    MATLAB tiff 文件格式与 PNG 文件格式。真正的无损压缩?

    python - 我怎样才能柔化这张图片的边缘

    java - 在 Java 中显示图像

    python - 使用 OpenCV 直方图均衡化时遇到问题

    php - PNG_ALL_FILTERS,php gd中的自适应过滤

    c - 带有 IDAT 的调色板基础 PNG,其 BTYPE=00 用于无压缩,现在带有 Adler32 代码

    android - Android 设备上的 GPU 编程

    python - 如何使用 Imagemagick 或 PIL 绘制高质量的图像描边(边框)?

    image-processing - 我需要留下图像中最大的物体

    windows - 如何使用管道(ffmpeg + imagemagick)构建视频缩略图表?