在.net框架中创建的多页TIFF图像文件具有更大的大小

本文关键字:文件 图像 框架 net 创建 TIFF | 更新日期: 2023-09-27 18:07:31

我用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图像文件具有更大的大小

我看到你使用的是BitmapCreateOptions.PreservePixelFormatTiffCompressOption.Ccitt4
MSDN关于TiffCompressOption枚举的说明:

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

也许这正在发生?图片是B/W吗?如果没有,尝试显式地使用LzwZip,看看它们是否比系统决定使用的默认值在您的图像上工作得更好!

而且,在我看来,5%的差异并不值得大惊小怪。这意味着你只能容纳57万张图片,而不是60万张。

区别似乎在于。net框架中创建的TIFF文件的内部结构。

我比较了。net框架和其他应用程序(Irfan和LibTff.NET)中创建的TIFF标签和文件结构,以及。net框架内部将TIFF文件划分为不同的条带和行数。这可能是Tiff编码器的内部实现,开发人员无法更改它。这对图像质量没有影响,但文件可能会稍微大一些。

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

StripByteCounts

  • 标签= 279 (117)Hex
  • 类型= word或dword
  • N = StripsPerImage for PlanarConfiguration = 1。=SamplesPerPixel * StripsPerImage for PlanarConfiguration = 2
  • 没有违约。

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

StripOffsets

  • 标签= 273 (111)Hex
  • 类型= word或dword
  • N = StripsPerImage for PlanarConfiguration = 1。=SamplesPerPixel * StripsPerImage for PlanarConfiguration = 2
  • 没有违约。

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

RowsPerStrip

  • 标签= 278 (116)Hex
  • 类型= word或dword
  • n = 1
  • 默认值是2**32 - 1,这实际上是无穷大。也就是说,
  • 建议条带大小为8K。

每个条带的行数。将图像数据组织为条带,以便在数据为时快速访问单个行压缩-虽然这个字段是有效的,即使数据不是压缩。

标签描述从
使用http://www.fileformat.info/format/tiff/corion.htm