r - TIFF 绘图生成和压缩 : R vs. GIMP 与 IrfanView 与 Photoshop 文件大小

标签 r imagemagick tiff gimp image-compression

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

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生成自 Rcompression="lzw" .查看方式 Volcano irfan.tifVolcano gimp.tif大小不同,但所有其他统计数据都相同。内存占用、DPI、颜色、分辨率是相同的。磁盘大小不同。

enter image description here

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

enter image description here

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/

相关文章:

r - ggplot2:添加背景层

c++ - 通过 SDL 像素数据生成 Magick++ 动画

javascript - 有没有办法使用 javascript 从 tiff 图像中提取地理标签?

wpf - 立即将图像加载到内存中

r - SparkR中使用grep出错

不允许从 Shiny 的输出对象中读取对象?

ImageMagick php imagick 从内存加载文件

ruby-on-rails - 将 Rmagick 与上传的文件一起使用

c# - 逐步加载多页 t​​iff 的 WPF 图像控件

java - 加载 rJava 时出错