16

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

但是,当我跑步时

convert photo.jpg photo.png 

我得到的文件大约是原始 jpg 的 6 倍。
原始 jpg 是一张大约 300x500 像素,52 kb 的普通照片。输出是相同尺寸的正确 png,但大小约为 307 kb?

有人知道黑客是怎么回事吗?难道我做错了什么?

PS:

我在 Debian 和 Windows 上都进行了尝试,结果相同。

PP:

此外,当我为此添加调整大小选项并将大小调整为 10000 x 10000 时。转换和调整大小为 jpg 需要几秒钟,但它可以工作,如果我对 png 执行相同操作,我只是 strt 完全耗尽内存

PPPS: 对于那些一直将这个问题标记为PNG、GIF、JPEG 和 SVG 重复的人 - 什么时候最好使用?. 请仔细阅读并理解问题。这不是重复的,因为这个问题询问的是使用特定应用程序(图像魔法)以编程方式生成的文件。您标记为重复的问题是询问哪种图像格式更适合在网络上使用。两个不同的问题。

4

6 回答 6

16

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

JPEG 代表“联合图像专家组”。那里应该告诉您 .JPG 文件格式已针对照片进行了优化。它不适用于线条艺术、徽标、渐变或平铺/图案背景等。.JPG 的 DCT(离散余弦变换)伪影(我们都知道和厌恶的“块状”伪影)在线条艺术和徽标中比在照片中更明显。

PNG 已经取代了 GIF,代替了 GIF 曾经擅长的一切,除了一个,这只是因为没有出现明确的标准:动画。动画 .GIF 在网络上广为人知。动画 .PNG 有两个相互竞争的标准:APNG 和 MNG。

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

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

PNG 可以做 GIF 做的所有事情(除了动画,除非用 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(索引颜色)的最著名的程序是 Adob​​e(以前称为 Macromedia)Fireworks。Photoshop “Save for Web and Devices”(至少从 CS3 开始)无法做到这一点,尽管在 Adob​​e 收购 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 透明度。
  • 对于色彩丰富的线条艺术和徽标(例如,大量渐变填充、金属铬型反射效果),如果您想要最好的质量或需要透明度(并且不介意它在 IE6 中不起作用或使用各种 IE6 变通方法之一来处理透明 PNG),并且不介意更大的文件和带宽使用。否则,请使用 .JPG,但请注意质量会下降。您可能需要将 JPEG 质量提高到相当高的水平,尤其是对于其中包含“文本”的徽标或其他图形,这会减少您节省的文件大小。
  • 对于非 Flash/Silverlight/video/HTML5 Canvas 动画,.GIF 是目前的主要选择,但要准备好切换到 APNG(我认为 MNG 不会击败它,尽管 JPEG 提供了更多的官方支持开发商)。
于 2012-03-13T23:09:24.217 回答
13

JPG 是一种有损压缩算法,而 PNG 是一种无损压缩算法。

仅这一事实(通常)会使 JPG 图像比 PNG 图像更小。您可以调整每种格式的压缩比,因此也可能是您对 PNG 文件的压缩程度不如 JPG 文件。

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

如果您的图像中有文本,那么 PNG 将生成质量更好的图像,因为字符的较硬边缘不会像使用 JPG 时那样模糊。

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

于 2010-04-21T21:34:15.453 回答
9

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

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

于 2010-04-21T22:01:20.720 回答
5

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

于 2010-04-21T21:36:01.703 回答
2

这取决于图像的类型。JPEG 的有损压缩非常适用于具有大量颜色渐变的图像(即照片)。

在由锐利边缘分隔的相同颜色区域组成的图像上尝试它(截图很好,除非它们显示照片桌面背景,而且 Vista 和 Windows 7 的花哨的窗口边框和任务栏也往往会搞砸)。JPEG 不擅长这种事情,您可能会发现 PNG 的压缩效果更好(可能也比 GIF 更好)。

于 2010-04-21T21:41:54.793 回答
2

回复: 有人知道黑客是怎么回事吗?难道我做错了什么?

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

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

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

对于最后一个支持者(2016 年): pngnq 已被弃用,取而代之的是 pngquant(https://github.com/pornel/pngquant

于 2012-12-30T23:56:05.450 回答