【问题标题】:Multipage TIFF image file created in .NET Framework has bigger size在 .NET Framework 中创建的多页 TIFF 图像文件具有更大的大小
【发布时间】:2014-06-09 07:49:59
【问题描述】:

我在 c# (.net framework 4.0) 中创建了用于创建多页 TIFF 文件的 windows 服务。 Windows servis 监视目录并将目录中的单页 TIFF 文件合并或拆分为多页 TIFF 文件。服务正在 Windows 2012 服务器上运行。

当我在另一个图像应用程序(例如 Irfan)中打开并保存由上述服务创建的 TIFF 文件时。保存的文件较小。在 Irfan 中,我以与原始文件相同的分辨率和压缩方式保存它。当我在资源管理器中比较文件的属性时,它们具有相同的尺寸、dpi 和压缩类型。

例如我在 .NET 中创建的多页 Tiff 文件有 426kB,当我在 Irfan 中打开并保存同一个文件时,它有 407kB。大约有 20kB 的差异。只有一个文件并不重要,但我在目录中有 60 万个文件:(

对于 TIFF 创建,我使用 System.Windows.Media.Imaging 它应该比 System.Drawing.Imaging (GDI+) 更好。

...

// load frontside of document
decoder = new TiffBitmapDecoder(imageStreamSource,BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

bitmapSourceFrontSide = decoder.Frames[currentFrame];

// load backside of document

//...

encoder = new TiffBitmapEncoder();
encoder.Compression = TiffCompressOption.Ccitt4;

CroppedBitmap tiffPage;

//...

// TIFF image can be divided to multipage tiff
tiffPage = new CroppedBitmap(bitmapSourceFrontSide, new Int32Rect(pagePosition, 0, pageFrameWidth, (int)bitmapSourceFrontSide.PixelHeight));

encoder.Frames.Add(BitmapFrame.Create(tiffPage));

if (bitmapSourceBackSide != null)
 {
 tiffPage = new CroppedBitmap(bitmapSourceBackSide, new Int32Rect(pagePosition, 0, pageFrameWidth, (int)bitmapSourceBackSide.PixelHeight));

    encoder.Frames.Add(BitmapFrame.Create(tiffPage));
 }

//... created and add all pages to tiff file let's save it

using(FileStream stream = new FileStream(FileName, FileMode.Create))
{ 
 encoder.Save(stream);
} 

你知道为什么在 .NET 中创建的 TIFF 文件会更大吗?

谢谢

【问题讨论】:

  • .net 可能会在文件中添加其他元数据。像 tiff 这样的图像有一个元数据部分,用于 GPS 信息等。如果你在优化器上运行,它应该减小文件的大小,即删除元数据。

标签: c# tiff filesize multipage


【解决方案1】:

我看到你正在使用 BitmapCreateOptions.PreservePixelFormatTiffCompressOption.Ccitt4
MSDN 说一下TiffCompressOption Enumeration

Ccitt3、Ccitt4 和 Rle 要求设置 PixelFormat 值 到黑白。将 PixelFormat 设置为任何其他值会重置 压缩属性值为默认值。

也许这正在发生?图片是黑白的吗?如果不尝试显式使用LzwZip,看看它们在您的图像上的效果是否比系统决定使用的默认值更好!

另外,imo,5% 的差异并不是什么令人沮丧的事情。这意味着您只能保存 570,000 张图片,而不是 600,000 张图片。

【讨论】:

    【解决方案2】:

    似乎区别在于从.Net Framework创建的TIFF文件的内部结构。

    我比较了在 .Net Framework 和其他应用程序(Irfan 和 LibTff.NET)中创建的 TIFF 标记和文件结构,并且 .NET Framework 内部将 TIFF 文件与不同的条数和行数进行了比较。它可能是 Tiff 编码器的内部实现,开发人员无法更改它。它对图像质量没有影响,但文件可能会稍大。

    文件的主要区别在于以下结构:

    StripByteCounts

    • 标签 = 279 (117)Hex
    • 类型 = word 或 dword
    • N = PlanarConfiguration 的 StripsPerImage 等于 1。= SamplesPerPixel * PlanarConfiguration 的 StripsPerImage 等于 2
    • 无默认值。

    对于每个条带,该条带中的字节数。存在 这个字段的大小大大简化了缓冲的繁琐工作 压缩数据,如果条带大小合理。

    StripOffsets

    • 标签 = 273 (111)Hex
    • 类型 = word 或 dword
    • N = PlanarConfiguration 的 StripsPerImage 等于 1。= SamplesPerPixel * PlanarConfiguration 的 StripsPerImage 等于 2
    • 无默认值。

    对于每个条带,该条带的字节偏移量。偏移量是 相对于 TIFF 文件的开头指定。笔记 这意味着每个条带都有一个独立于 其他条带的位置。此功能可能对 编辑应用程序。此字段是读者唯一的途径 找到图像数据,因此必须存在。

    RowsPerStrip

    • 标签 = 278 (116)Hex
    • 类型 = word 或 dword
    • N = 1
    • 默认值为 2**32 - 1,实际上是无穷大。那就是 整张图片是一条。
    • 推荐条带大小为 8K。

    每个条带的行数。图像数据被组织成 条带,以便在数据存储时快速访问各个行 压缩 - 尽管这个字段是有效的,即使数据不是 压缩。

    标签描述来自
    http://www.fileformat.info/format/tiff/corion.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      相关资源
      最近更新 更多