代码之家  ›  专栏  ›  技术社区  ›  konung

为什么ImageMagick生成的.png文件比.jpg和.gif文件大得多[[副本]

  •  16
  • konung  · 技术社区  · 14 年前

    我用ImageMagick把一些文件从一种格式转换成另一种格式。我一直认为.png文件应该和.jpg一样大/一样小,如果不是更小的话,而且肯定比.gif小。

    但是当我跑的时候

    convert photo.jpg photo.png 
    

    我得到的文件比原来的jpg大6倍。
    原来的jpg是一个普通的照片约300x500像素,52 kb。输出是一个大小相同的png,但大小约为307KB?

    有人知道黑客在干什么吗?我做错什么了吗?

    附笔。:

    另外,当我添加了resize选项并将其调整为10000 x 10000时,转换和调整为jpg需要几秒钟的时间,但是它可以工作,如果我对png做同样的操作,我的jsut strt内存将全部用完

    P.P.P.S.: 对于那些一直把这个问题标为 PNG vs. GIF vs. JPEG vs. SVG - When best to use?

    6 回复  |  直到 7 年前
        1
  •  13
  •   ChrisF    8 年前

    JPG是一个 lossy compression lossless one .

    如果你的图像中有文本,那么PNG会产生更好的图像质量,因为字符的硬边不会像JPG那样模糊。

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

        2
  •  16
  •   rmunn    11 年前

    这里需要注意的关键是,每种图像文件格式都适合特定的用途。

    JPEG代表关节 照相的 照片 . 它对线条艺术、标志、渐变或平铺/图案背景等都不太适用。JPGs-DCT(离散余弦变换)伪影(我们都知道并且厌恶的块状伪影)在线条艺术和徽标中比在照片中更为明显。

    动画。 动画。gif在网上很有名。动画PNG有两个相互竞争的标准:APNG和MNG。

    大多数现代浏览器都支持APNG,并且完全向后兼容(文件扩展名是.PNG,而不是.APNG,如果任何可以显示.PNGs但不知道APNG的程序都提供了APNG,它将显示开发人员选择的替代图像,或者动画的第一帧(如果没有提供旧程序所需的替身,那么它只是一个普通的单帧。PNG中有一个图像,其余的可以安全地忽略)。壁虎, 等。

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

    PNG做了GIF做的所有事情(除了动画,除非用APNG增强),而且做得更好。在其他条件相同的情况下,在相同的分辨率和位深度下,.PNG几乎总是比.GIF小。与.GIF类似,.PNG可以在索引颜色(paleted)模式下支持最高8位/像素的颜色深度,但与.GIF不同(但与.JPEG类似),它还支持每像素24位的直接颜色模式。

    部分 透明,而使用索引透明(仅在.GIF中可用)时,您的选择要么不透明,要么不可见。当放置在背景色(而不是.GIF或index.PNG最初所用的背景色)上时,这会在非矩形对象周围形成光晕。它还禁止执行诸如光晕、阴影等效果,当然,还禁止穿透彩色对象(无抖动)。Alpha transparency可以在几乎任何背景下轻松完成所有这些任务(在白色背景下,光晕基本上是不可见的,在黑色背景下,阴影是不可见的,但你知道我的意思)。

    是的,你可以做8位 阿尔法 一个国家的透明度 索引颜色 .PNG!你猜怎么着?即使是微软的InternetExplorer6也可以很好地显示这些,完全透明!只有32位的.PNGs(24位RGB颜色+8位alpha)被IE6阻塞并显示为灰色!

    最著名的程序,可以导出PNG8(索引颜色)与 阿尔法

    无论如何,完整的32位(甚至24位)PNG会相当大,尽管通常比最接近的.BMP或.TGA或uncompressed.TIFF或类似的文件要小得多(除非你想用它来拍照,这就是JPEG的用途!)。它通常会比.RLE(lossless compressed.BMP)或lossless compressed.TIF小一些,其他条件相同。

    与大多数其他格式不同,PNG还支持48位RGB颜色,可选16位alpha透明度,以获得极高的质量(远高于大多数显示器的显示)。它们最好用作中间存储格式,以保留来自高位深度扫描仪或照相机(原始模式)或类似设备的信息。尽管进行了无损压缩,但它们的文件大小将相当大。

    PNG目前无法处理非RGB颜色空间,如CMYK或L*a*b。

    简而言之:

    • 对于照片,请使用.JPG。
    • 对于有限颜色的线条艺术和徽标,请使用index color.PNG(PNG8),如果需要,还可以使用alpha透明度。
    • 例如 很多渐变填充,金属铬反射效果, 等。 )如果需要的话,使用direct color.PNG(PNG24)和alpha,如果你想要最好的质量或者需要透明度(不要介意它不能在IE6中工作或者使用IE6中的一种解决方案来实现透明PNG),也不要介意更大的文件和带宽使用。否则,请使用.JPG,但要注意质量会降低。你可能需要把JPEG的质量提高到相当高的水平,特别是对于徽标或其他带有文本的图形,这会减少你的文件大小节省。
    • 对于不闪式/Silverlight/video/HTML5画布动画,.GIF是目前的主要选择,但要准备好切换到APNG(我不认为MNG会打败它,尽管JPEG开发者提供了更多的官方支持)。
        3
  •  9
  •   Mark Ransom    14 年前

    PNG格式可以提供每像素24位或每像素8位的图像。JPG是一种24位格式,但它使用有损压缩来显著减小文件大小。PNG和GIF都使用无损压缩,但GIF只能使用8位,所以它要求图像的颜色为256色或更少,这通常会导致图像更粗糙。

    试试这个 -colors -dither

        4
  •  5
  •   Hans Passant    14 年前

    jpeg文件格式是一种有损格式,它会丢弃信息。这有助于提高压缩比。gif文件格式不会有损,但会丢失其他信息,它只支持256色。.png文件格式没有损失 保留颜色范围。

        5
  •  2
  •   Michael Borgwardt    14 年前

    这取决于图像的类型。JPEG的有损压缩在具有大量颜色梯度的图像(即照片)上工作得非常好。

    在一个由相同颜色的区域组成的图像上试试看,这些区域之间用锐利的边缘隔开(屏幕截图是好的,除非它们显示桌面背景,而Vista和Windows7的奇特的窗口边框和任务栏也会把这个弄得一团糟)。JPEG在这方面做得不好,你可能会发现PNG压缩得更好(可能也比GIF好)。

        6
  •  2
  •   Sérgio    8 年前

    答复: 有人知道黑客在干什么吗?我做错什么了吗?

    我用reduce或者pngnq压缩png来解决这个问题( http://pngnq.sourceforge.net/

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

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

    上一次投票(2016年):pngnq被否决,取而代之的是pngquant( https://github.com/pornel/pngquant