【问题标题】:TIFF plot generation and compression: R vs. GIMP vs. IrfanView vs. Photoshop file sizesTIFF 绘图生成和压缩:R 与 GIMP 与 IrfanView 与 Photoshop 文件大小
【发布时间】:2014-01-19 18:14:14
【问题描述】:

例如,我生成了一些高分辨率的出版质量图

library(plot3D)
Volcano<-volcano
zf=10 #zoom factor
tiff("Volcano.tif", width=1800*zf, height=900*zf, res=175*zf, compression="lzw")
image2D(z = Volcano, clab = "height, m",colkey = list(dist = -0.20, shift = 0.15,side = 3, length = 0.5, width = 0.5,cex.clab = 1.2, col.clab = "white", line.clab = 2,col.axis = "white", col.ticks = "white", cex.axis = 0.8))
dev.off()

文件大小为 22 MB。

现在我用 GIMP 打开文件,什么都不做我将它导出为“Volcano gimp.tif”(不要更改分辨率,或做任何其他事情)。 GIMP 生成一个 1.9 MB 的文件(“Volcano gimp.tif”)。

imagemagick 报告类似的图像统计信息:

$ identify Volcano.tif
Volcano.tif TIFF 18000x9000 18000x9000+0+0 8-bit DirectClass 22.37MB 0.000u 0:00.000
$ identify "Volcano gimp.tif"
Volcano gimp.tif TIFF 18000x9000 18000x9000+0+0 8-bit DirectClass 1.89MB 0.000u 0:00.000

即使使用identify -verbose,这两个文件看起来也很相似。

这些文件有什么区别?为什么它们的文件大小如此不同?

更新:好的,事情越来越疯狂了。我对 IrfanView 做了同样的事情,我得到了不同的文件大小。初始文件是从Rcompression="lzw" 生成的Volcano.tif。检查Volcano irfan.tifVolcano gimp.tif 在大小上有何不同,但所有其他统计数据都相同。内存占用、DPI、颜色、分辨率是相同的。磁盘大小不同。

更新 2:Adobe Photoshop 将文件保存到 2.6 MB

WinRar 报告说原始 R 生成的 TIFF 是高度可压缩的(从 22MB ->3.6MB)

更新 3:此问题可能类似于 Montage / Join 2 TIFF images in a 2 col x 1 row tile without losing quality

更新 4: R 生成的 TIFF 文件可以在这里找到http://ge.tt/7ZvRd4C1/v/0?c

【问题讨论】:

  • tiff 函数似乎有问题。在我的 Win7 机器上,(稍微过时的 v2.15.2)R 根本不会使用压缩 rlejpegzip 创建有效的图像文件。稍后将在另一台机器上进一步调查。同时,尝试使用tiff 选项,看看您是否可以复制我的奇怪行为。这里可能埋有一个错误。
  • compression="zip" 粉碎了我的会话!
  • R 生成的 TIFF 文件未使用 TIFF 预测器。这在处理 24-bpp 数据时会导致可怕的压缩,因为 LZW 压缩一次只能工作 8 位。预测器允许恒定颜色部分“相互抵消”,变为黑色并更好地压缩。
  • 好的,谢谢您的信息。这实际上意味着什么?问题仅仅在于压缩吗?我应该以未压缩的形式输出然后用 GIMP 压缩吗?也请将此作为答案而不是评论(包括更多细节会有所帮助,我正在考虑将此作为错误提交)。
  • 以后,您可以使用我的 TIFFTOOL 查看这些文件为何不同的所有详细信息:bitbanksoftware.com/tinytools.html

标签: r imagemagick tiff gimp image-compression


【解决方案1】:

显然,R 使用的 TIFF LZW 压缩器没有使用导致文件非常大的重要选项(TIFF 预测器)。当数据压缩能够识别数据中的对称性/冗余时,它的效果最好。在这种情况下,图像数据由包含红色、绿色和蓝色 8 位值的 24 位(3 字节)像素组成。标准 LZW 压缩查看重复模式的字节流。如果将彩色图像简单地视为字节流,它将看到 3 字节的重复模式,而不是恒定颜色的重复模式。对数据启用 TIFF 预测器会导致差分过滤器存储每个像素与其相邻像素的增量。如果相邻像素是相同的颜色,它将存储 0。一长串 0 的压缩效果比重复至少 3 个字节长的非零模式要好得多。

这是一个如何在 6 像素线上工作的示例。编码时,预测器从右边缘开始,为每条扫描线向左工作:

Original data:
2A 50 40 2A 50 40 2A 50 40 2A 50 40 2A 50 40 2A 50 40 (6 pixels of the same color)

After horizontal differencing (TIFF predictor):
2A 50 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

The data is much more compressible after the predictor since long runs of the same value (0x00) are easier for LZW to compress.

结论:这应该作为针对 R 压缩代码所有者的错误提交,因为在没有预测器的情况下在全彩色图像上使用 LZW 会产生较差的结果。同时,需要一种解决方法来更有效地压缩它。

【讨论】:

  • 优秀。谢谢你。我提交了一个错误 bugs.r-project.org/bugzilla/show_bug.cgi?id=15626 。在此期间我应该做什么?我应该保存未压缩的 TIFF 并使用 GIMP 或 ImageMagick 压缩它们还是将绘图保存为 PNG 然后将它们转换为 TIFF?
  • PNG 应该为您提供最小的文件,因为它利用了水平和垂直对称性。未压缩的 TIFF 会占用大量磁盘空间,因此即使是压缩不佳的 TIFF 也是更好的选择。最终文件格式的选择取决于打开它们的软件。他们都使用无损压缩,因此原始数据得以保留。
  • 当我使用 R 生成的压缩不良的 TIFF 并将其打开并使用 GIMP 保存时会发生什么。 LZW 压缩是否正常工作?这是无损的吗? PNG-> TIFF 也是无损的吗? (我的出版商需要 TIFF)
  • PNG 和 TIFF LZW 是无损的(有或没有预测器)。您计划使用的所有文件转换都将产生相同的输出,因此唯一的区别是文件大小。
  • 感谢您的知识渊博的回答!
猜你喜欢
  • 2012-07-30
  • 2012-10-03
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多