例如,我生成了一些高分辨率的出版物质量图
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 做了同样的事情,我得到了不同的文件大小。初始文件是
Volcano.tif
生成自 R
与 compression="lzw"
.查看方式 Volcano irfan.tif
和 Volcano 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
最佳答案
显然,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 会产生较差的结果。同时,需要一种变通方法来更有效地压缩它。
关于r - TIFF 绘图生成和压缩 : R vs. GIMP 与 IrfanView 与 Photoshop 文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20880558/