使用ImageMagick将图像转换为PNG与JPG

时间:2014-09-09 01:11:42

标签: imagemagick

我尝试将某些图片转换为PNG或JPG,然后尝试找出哪种格式会导致文件较小。在大多数情况下,PNG会给我最好的压缩,但有些奇怪的图像我可以更好地压缩JPG。我有两个问题:

  1. 图像的哪些特征会使其产生更好的效果?

  2. 有没有办法预先确定哪种格式会让我更好 结果没有先转换它们?

  3. 此照片使用PNG提供更好的压缩效果

    Example of image with better compression using PNG

    这张照片使用JPG提供了更好的压缩

    enter image description here

3 个答案:

答案 0 :(得分:3)

我绝对没有时间进一步发展这种思路,但图像熵可能是选择JPEG或PNG的一个很好的判别 - 请参阅我之前对你的问题的评论。

如果你使用ImageMagick,你可以像这样轻松地计算熵:

identify -verbose -features 1 image.jpg | grep -i -A1 entropy

您的上图提供了如下输出:

identify -verbose -features 1 t.jpg | grep -i -A1 entropy
Sum Entropy:
    0.703064, 0.723437, 0.733147, 0.733015, 0.723166
  Entropy:
    1.01034, 1.12974, 1.14983, 1.15122, 1.11028
  Difference Entropy:
    0.433414, 0.647495, 0.665738, 0.671079, 0.604431

并且您的底部图像提供如下输出:

identify -verbose -features 1 b.jpg | grep -i -A1 entropy
  Sum Entropy:
    1.60934, 1.62512, 1.65567, 1.65315, 1.63582
  Entropy:
    2.19687, 2.33206, 2.44111, 2.43816, 2.35205
  Difference Entropy:
    0.737134, 0.879926, 0.980157, 0.979763, 0.894245

我怀疑具有更高熵的图像将更好地压缩,因为JPEG和具有较低熵的图像将更好地作为PNG - 但我现在必须冲刺: - )

每种类型的熵有5个值 - 水平,垂直,左诊断,右诊断和整体。我认为最后一个值是你唯一需要考虑的值。

<强>更新

好的,我现在有更多的时间花在这上面。我没有一堆样本图像来测试我的理论,所以我采用了不同的方式。我制作了一个小脚本来计算给定输入文件的以下内容:

  • JPEG尺寸与PNG尺寸的比率

这是:

#!/bin/bash
f="$1"
jsize=$(convert "$f" -strip JPG:- | wc -c)
psize=$(convert "$f" PNG:- | wc -c)
jpratio=$(echo $jsize*100/$psize | bc)
# Make greyscale version for entropy calculation
rm temp*.jpg 2> /dev/null
convert "$f" -colorspace gray temp.jpg
entropy=$(identify -verbose -features 1 temp.jpg | grep -A1 "  Entropy:" | tail -n 1 | awk -F, '{print $5}')
echo $jpratio:$entropy

因此,对于给定的图像,您可以这样做:

./go image.jpg
8:3.3       # JPEG is 8x bigger than PNG and entropy is 3.3

然后我拍摄了你的图像并添加了不同数量的噪点以增加其熵,就像这样

for i in {1..99}; do convert bottom.jpg +noise Gaussian -evaluate add ${i}% xx${i}.jpg;done

给我的文件名为xx1.jpg,噪音为1%,xx2.jpg,噪音为2%等等,最高为xx99.jpg,噪音为99%。

然后我通过第一个脚本运行每个文件,如下所示:

for f in xx*.jpg; do ./go $f;done > data.txt

给我data.txt

然后我创建了以下gnuplot命令文件plot.cmd

set title 'Plotted with Gnuplot'
set ylabel 'Entropy'
set xlabel 'JPEG size/PNG Size'
set grid
set terminal postscript color landscape dashed enhanced 'Times-Roman'
set output 'file.eps'
plot 'data.txt'

并用

运行它
gnuplot plot.cmd

我得到了下面的图表,显示随着ImageMagick的熵数增加,JPEG大小与PNG大小的比率提高,有利于JPEG ...不是很科学,但至少是一些东西。也许你可以针对你通常使用的图像类型运行脚本,看看你得到了什么。 enter image description here

答案 1 :(得分:0)

这在很大程度上取决于您的使用案例。

1)JPG通常不如文字好,因为工件往往会“涂抹”或模糊图像。对于照片,这通常不是问题;对于高分辨率的文本图像,问题也不那么明显(因为模糊半径相对于图像尺寸较小)。

请注意,PNG通常用于无损压缩图像,而JPG本质上是有损的。压缩率越高,JPG文件就越小,但工件会更加明显。另请注意,有些程序可以在PNG中进行有损压缩(在某些情况下可能会胜过JPG压缩)。

简而言之:PNG可以很好地处理计算机生成的图像,因为它们往往非常规则,因此容易放气。对于往往有更多抖动的照片,JPG会更好,这很难压缩。当您离开ImageMagick和libpng时,还有其他可能性。

2)虽然可以训练神经网络来决定JPG或PNG是否会更好地压缩,但它可能需要更长时间并且不如仅仅尝试两者并查看输出那么精确。另请注意,有一些近似测量值可以告诉您图像是否过于模糊(如果您想进一步调整,可能会帮助您设置正确的压缩级别。)

答案 2 :(得分:-1)

一个很大的区别是PNG允许使用Alpha透明胶片,这样您就可以看到图像背后的部分内容。 Jpg将阻止一个矩形。