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

使用ImageMagick将图像转换为PNG与JPG,imagemagick,Imagemagick,我正在尝试将一些图像转换为PNG或JPG格式,并试图找出哪种格式会导致文件大小变小。在大多数情况下,PNG会给我最好的压缩效果,但是一些奇怪的图像我从JPG中得到了更好的压缩效果。我有两个问题: 图像的哪些特征会使其产生更好的结果 有没有办法预先确定哪种格式会给我带来更好的效果 不先转换的结果 这张照片使用PNG提供了更好的压缩效果 这张照片使用JPG提供了更好的压缩效果 这在很大程度上取决于您的用例 1) JPG通常不适合文本,因为伪影往往会“弄脏”或模糊图像。对于照片,这通常不是问题;此外

我正在尝试将一些图像转换为PNG或JPG格式,并试图找出哪种格式会导致文件大小变小。在大多数情况下,PNG会给我最好的压缩效果,但是一些奇怪的图像我从JPG中得到了更好的压缩效果。我有两个问题:

  • 图像的哪些特征会使其产生更好的结果

  • 有没有办法预先确定哪种格式会给我带来更好的效果 不先转换的结果

  • 这张照片使用PNG提供了更好的压缩效果

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


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

    1) JPG通常不适合文本,因为伪影往往会“弄脏”或模糊图像。对于照片,这通常不是问题;此外,对于高分辨率文本图像,问题将不太明显(因为模糊半径相对于图像大小较小)

    请注意,PNG通常用于无损压缩图像,而JPG本身就是有损的。使用更高的压缩比,JPG文件将更小,但伪影会更明显。还要注意的是,有一些程序能够在PNG中进行有损压缩(在某些情况下,它可以很好地击败JPG压缩)

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


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

    一个很大的区别是PNG允许alpha透明,以便您可以看到图像后面的部分内容。Jpg将屏蔽一个矩形。

    我绝对没有时间进一步发展这一思路,但图像熵可能是选择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
    
    for f in xx*.jpg; do ./go $f;done > data.txt
    
    顶部图像的输出如下所示:

    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
    
    for f in xx*.jpg; do ./go $f;done > data.txt
    
    您的底部图像提供如下输出:

    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
    
    for f in xx*.jpg; do ./go $f;done > data.txt
    
    我怀疑熵较高的图像作为JPEG压缩效果更好,而熵较低的图像作为PNG压缩效果更好,但我现在必须冲刺:-)

    每种类型的熵有5个值-水平、垂直、左对角线、右对角线和总体。我认为最后一个值是你唯一需要考虑的。< /P> 已更新

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

    • 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%

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

    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
    
    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。。。不是很科学,但至少有些东西。也许你可以对你通常使用的图像类型运行脚本,看看你得到了什么。

    一般来说,PNG更适用于计算机生成的图像,JPEG更适用于真实的相机拍摄的照片。一般来说,计算机生成的图像具有较小的颜色调色板(变化较小),而照片具有较高的频率成分(在图片中移动时变化非常快)。很难说事先。。。也许看一下图像统计数据会给你一个开始。和的可能重复以及许多其他与这些相关的问题……你可能也喜欢这个问题:这不是JPG与PNG的问题,所以stackoverflow问题是不相关的,超级用户一个是相当有趣的。谢谢你能提供第一张图片的原始PNG版本的链接吗?当
    PNG
    转换为JPEG时,很难评论
    JPG
    PNG
    之间的区别!这不是我要问OP的问题:答案是,图像上的熵越小(即图像上的“信息”越少),PNG就越好,因为PNG试图保存所有信息。另一方面,JPEG是一种有损格式,对于包含大量信息的图像,它会做得更好,因为JPEG实际上并不关心信息,它会尽可能准确地表示信息,但绝不是无损的。因此,正如马克·塞切尔所说,这是一个熵的问题。我个人会接受的,伙计。哇!多好的答案啊!这正是我想要的:)