我有一张压缩的 PNG 图像compressed.png
。我可以使用 GIMP 将其转换为未压缩的 PNG decompressed.png
(保存为 PNG 并将压缩级别设置为 0)。如何在命令行(Linux)上完成此操作?
我记得以前用过Imagemagick,但convert
我忘了怎么做。我尝试了一些我认为应该有效的东西,基于文档:
convert compressed.png -compress None decompressed.png
convert compressed.png +compress decompressed.png
convert compressed.png -quality 0 decompressed.png
convert compressed.png -quality 00 decompressed.png
只是写了一个普通的压缩PNG。
另外:你为什么想要未压缩的 PNG?
一些案例:
- 您希望支持图像数据的有效(二进制)差异,同时仍使用 PNG 格式的其他功能(而不是存储原始图像数据或 BMP)。
- 您想将多张 PNG 压缩到 tarball 或 7z 存档中,但又想继续使用 PNG 功能。如果图像足够相似,这可以比单独压缩提供更好的压缩率。
- 可用作测试 PNG 优化器的基准尺寸。
答案1
ImageMagick 总是会压缩 PNG 文件。使用以下方法可以获得最差的压缩率:
convert -verbose -quality 01 input.png output.png
但这取决于图像内容(0 将使用 Huffman 压缩,有时压缩效果比 zlib 更好)。
您可以尝试其他工具,例如 pngcrush(http://pmt.sourceforge.net/pngcrush/)禁用压缩:
pngcrush -force -m 1 -l 0 input.png output.png
它创建的文件大小与 GIMP 使用压缩级别 0 时创建的文件大小相同(多或少几个字节)。
一些示例尺寸(对于照片 PNG,1600x1200):
- 原始:1,693,848字节。
- IM 之后:2,435,983 字节。
- GIMP 之后:5,770,587 字节。
- pngcrush 之后:5,802,254 字节。
答案2
引用 ImageMagick 文档:并非所有压缩级别、策略和 PNG 滤镜类型的组合都可以使用 -quality 选项获得。如需更精确的控制,您可以使用 -define 选项。
例如,此命令应创建一个未压缩的(RGB)PNG 文件:
convert INFILE \
-define png:compression-level=0 \
-define png:compression-filter=0 \
-define png:color-type=2 \
OUTFILE.png
您可能会收到警告,但这是一个无害的错误。它仍会生成正确的 png。http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20257
示例图片:
112233 112233 112233 112233
445566 445566 445566 445566
778899 778899 778899 778899
aabbcc aabbcc aabbcc aabbcc
使用 IM 创建的 PNG 文件的 IDAT 块:
49444154081d013400cbff00
11223311223311223311223300
44556644556644556644556600
77889977889977889977889900
aabbccaabbccaabbccaabbcc
7d6f14b9...
然而,对于某些情况(例如组压缩),可能值得测试开销较少的格式,例如 TARGA (.tga)。
答案3
我喜欢 netpbm 工具套件,它是根据 UNIX“软件工具”传统设计的:“编写只做一件事的程序,并把它做好”。
你可以按照你的要求做这样的事情:
< in.png pngtopnm > image.pnm
< in.png pngtopnm -alpha > alpha.pnm
<image.pnm pnmtopng -alpha alpha.pnm -compression 0 > out.png
rm image.pnm alpha.pnm
您可能会丢失原始 png 文件中的某些元数据。
由于我们处理 alpha 通道的方式,它看起来有点复杂。
Netpbm 是一个用于处理图形图像的工具包,包括各种不同格式之间的图像转换。该软件包中有超过 220 个独立工具,其中包括 80 多种图形格式的转换器。