首页 文章

为什么ImageMagick生成的'.png'文件比'.jpg'&'.gif'文件大得多? [重复]

提问于
浏览
16

这个问题在这里已有答案:

我正在使用ImageMagick将一些文件从一种格式转换为另一种格式 . 我总是认为.png文件应该像.jpg一样大/小,如果不小,并且肯定小于.gif .

但是,当我跑

convert photo.jpg photo.png

我拿出的文件比原来的jpg大6倍 .
原始jpg是一张约300x500像素,52 kb的常规照片 . 输出是相同尺寸的合适png,但大小约为307 kb?

是否有人知道hack正在发生什么?难道我做错了什么?

P.S:

我在Debian和Windows上都尝试了相同的结果 .

P.P.S:

此外,当我为此添加调整大小选项并调整为10000 x 10000.转换和调整大小到jpg需要几秒钟,但它的工作原理,如果我做同样的png,我jsut strt完全耗尽了内存

P.P.P.S.: 对于将此问题标记为PNG vs. GIF vs. JPEG vs. SVG - When best to use?的副本的人 . 请仔细阅读并理解问题 . 它's not a duplicate, since this question asks'关于使用特定应用程序(图像magick)以编程方式生成的文件 . 您标记为重复的问题是询问哪种图像格式更适合在网络上使用 . 两个不同的问题 .

6 回答

  • 2

    JPG是lossy compression算法,而PNG是lossless one .

    仅此事实(通常)会使JPG图像小于PNG图像 . 您可以调整每种格式的压缩比,因此您也可能没有像JPG那样压缩PNG文件 .

    对于保存照片图像,JPG通常会生成比PNG更小的文件,因为图像中的噪声或随机性更多,可以使用压缩 . 由图形艺术工具创建的图像往往具有更多的硬边缘和纯色区域,这将在PNG中更好地压缩 .

    如果你的图像中有文字,那么PNG将产生更高质量的图像,因为字符的较硬边缘不会像使用JPG时那样模糊 .

    GIF较小,因为它基于调色板(256色)而不是JPG和PNG中每个像素(或像素组)的单独RGB值 .

  • 5

    这里要注意的关键是每种图像文件格式最适合特定用途 .

    JPEG代表“Joint Photographic Experts Group . ”这就应该告诉你.JPG文件格式是针对照片进行优化的 . 它对于艺术品,徽标,渐变或平铺/图案背景等不太有效 . .JPG的DCT(Discreet Cosine Transform)工件(我们都知道并厌恶的“块状”工件)使用艺术线条和徽标比使用照片更加引人注目 .

    PNG已经取代了GIF,除了一个GIF以外的所有东西,只是因为没有明确的标准出现: animations. 动画.GIF在网络上是众所周知的 . 动画.PNG有两个相互竞争的标准:APNG和MNG .

    APNG在大多数现代浏览器中都受支持,并且也完全向后兼容(文件扩展名为.PNG,而不是.APNG,如果任何可以显示.PNG但不知道APNG被“馈送”到APNG的程序,它将会显示开发人员选择的替代图像,或者如果没有提供这样的替换,则显示动画的第一帧 - 就旧程序而言,它只是一个普通的单帧.PNG,只有一张图像在其中 - 其余部分被安全地忽略) . Gecko(FF等)和Presto(Opera)原生支持它,谷歌Chrome(使用Webkit)可以附加一个插件 .

    MNG拥有实际PNG格式开发团队的支持,但它是自己的格式,不向后兼容,但功能更强大,更灵活 . 目前,只有基于KHTML的浏览器(Konquerer)支持它:不是Trident(IE),Gecko,Webkit(Chrome,Chromium,Safari),也不是Presto .

    除了GIF之外,PNG还可以做更好的事情(动画除外,除非通过APNG增强) . 在其他条件相同的情况下,.PNG在相同分辨率和位深度下几乎总是小于.GIF . 与.GIF类似,.PNG可以在索引颜色(调色板)模式下支持每像素高达8位的颜色深度,但与.GIF(还有.JPEG)不同,它还支持每像素24位的直接颜色模式 .

    在任何一种模式下,它都可以添加8位的alpha透明度,与.GIF不同(它只能做索引颜色透明度[从调色板中挑选颜色,以100%透明度替换,又名不可见] - .PNG也可以这样做 . Alpha透明度比索引透明度产生更好的结果,因为像素可以是部分透明的,而对于索引透明度(.GIF中唯一可用的类型),您的选择是不透明的或不可见的 . 这使得非矩形对象周围的“晕圈”在背景颜色下放置,而.GIF或索引的.PNG最初是“乱蓬蓬”的 . 它还会抑制能够发挥诸如发光,阴影,当然还有透明的彩色物体(没有抖动)等效果 . Alpha透明度可以轻松地完成所有这些事情,几乎可以在任何背景下进行(白色背景上的发光很大程度上是不可见的,并且黑色上的阴影将是不可见的,但你知道我的意思) .

    是的,您可以在索引颜色.PNG中执行8位Alpha透明度!你猜怎么着?即使是Microsoft Internet Explorer 6也可以显示那些很好的,完整的透明度!它只是32位.PNG(24位RGB颜色8位alpha)IE6窒息并显示为灰色!

    可以导出具有Alpha透明度的PNG8(索引颜色)的最着名的程序是Adobe(以前的Macromedia)Fireworks . Photoshop“Save for Web and Devices”(至少从CS3开始)无法做到这一点,尽管在Adobe收购Macromedia时基本上已经从Fireworks中取消了该功能 . 它可以保存PNG8,但只能使用索引颜色透明度 .

    无论如何,完整的32位(甚至24位)PNG将会非常大,但通常比最接近的等效.BMP或.TGA或未压缩的.TIFF或其他一些小得多(除非你试图用它 - 这就是JPEG的用途!) . 它通常会比.RLE(无损压缩.BMP)或无损压缩.TIF小一些,其他条件相同 .

    与大多数其他格式不同,PNG还支持48位RGB颜色,可选16位Alpha透明度,质量极高(远高于大多数显示器可显示的) . 这些最适合用作中间存储格式,以保留来自高位深度扫描仪或相机(RAW模式)或某些此类的信息 . 尽管无损压缩,它们的文件大小仍然很大 .

    .PNG目前无法做的一件事是处理非RGB颜色空间,例如CMYK或L * a * b .

    简而言之:

    • 对于照片,请使用.JPG .

    • 对于有限颜色的艺术线条和徽标,请使用索引颜色.PNG(PNG8),如果需要,使用Alpha透明度 .

    • 对于线条艺术和广泛颜色的徽标(例如大量渐变填充,金属铬型反射效果等),如果您需要最佳质量或需要透明度,请使用带有alpha的直接颜色.PNG(PNG24) (并且不介意它不能在IE6中工作或使用各种IE6变通方法之一的透明PNG),并且不介意更大的文件和带宽使用 . 否则,请使用.JPG,但请注意质量会降低 . 您可能需要将JPEG质量提高到相当高的水平,特别是对于带有“文本”的徽标或其他图形,这会减少文件大小的节省 .

    • 对于非Flash / Silverlight /视频/ HTML5 Canvas动画,.GIF如果是目前的主要选择,但准备切换到APNG(我不认为MNG会打败它,尽管更多的官方支持来自JPEG开发人员) .

  • 16

    PNG格式可以提供每像素24位或每像素8位的图像 . JPG是24位格式,但它使用有损压缩来显着减小文件大小 . PNG和GIF都使用无损压缩,但GIF仅适用于8位,因此它要求您的图像具有256色或更少 - 这通常会产生更加颗粒的图像 .

    尝试使用ImageMagick中的 -colors-dither 选项来减少PNG输出中的位数 . 此时,它应该与GIF文件大小相当 . 如果您需要进一步减少它,可以使用实用程序来优化PNG .

  • 12

    .jpeg文件格式是一种有损格式,它会丢弃信息 . 这样可以获得良好的压缩比 . .gif文件格式没有损失但丢失了其他信息,它只支持256种颜色 . .png文件格式没有损失并保留了颜色范围 .

  • 9

    这取决于图像的种类 . JPEG的有损压缩在具有大量色彩渐变(即照片)的图像上非常有效 .

    尝试在由锐边分隔的相同颜色区域组成的图像上(截图很好,除非它们显示照片桌面背景,Vista和Windows 7的花式窗口边框和任务栏也倾向于搞乱这一点) . JPEG在这种情况下很糟糕,你可能会发现PNG压缩效果更好(也可能比GIF更好) .

  • 2

    回复:有谁知道hack正在发生什么?难道我做错了什么?

    是的,我研究这个,你没有做错什么,你产生了8位/彩色RGB PNG我用减少或压缩png解决它与pngnq(http://pngnq.sourceforge.net/)产生8位/彩色色彩图PNG .

    pngnq在我看来是最改进的项目,因为它是像pngquant等其他人的分支,并且通常在Linux发行版的主流中,所以我只是这样做:

    convert photo.jpg png:- | pngnq -s 1 > photo.png
    

    对于最后一个upvoter(2016):pngnq被弃用以支持pngquant(https://github.com/pornel/pngquant

相关问题