在.NET Framework中创建的多页TIFF图像文件具有更大的大小

时间:2014-06-09 07:50:00

标签: c# tiff filesize multipage

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

当我打开然后将提到的服务创建的TIFF文件保存在另一个图像应用程序(例如Irfan)中时。保存的文件较小。在Irfan中,我使用与原始文件相同的分辨率和压缩率进行保存。当我比较资源管理器中的文件属性时,它们具有相同的维度,dpi和压缩类型。

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

对于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文件有更大的尺寸吗?

谢谢

2 个答案:

答案 0 :(得分:2)

我发现您正在使用BitmapCreateOptions.PreservePixelFormatTiffCompressOption.Ccitt4 MSDN说TiffCompressOption Enumeration

  

Ccitt3,Ccitt4和Rle要求设置PixelFormat值   到BlackWhite。将PixelFormat设置为任何其他值将重置   压缩属性值为Default。

也许这种情况正在发生?图像B / W?如果没有尝试明确使用LzwZip来查看它们在图片上的效果是否超出系统决定使用的默认值!

另外,imo,5%的差异并不是让人感到沮丧的事情。这意味着,不是600,000张图像,而是只能容纳570,000张图像。

答案 1 :(得分:1)

似乎差异在于.Net Framework创建的TIFF文件的内部结构。

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

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

StripByteCounts

  • 标签= 279(117)十六进制
  • Type = word或dword
  • N = PlanarConfiguration的StripsPerImage等于1. = SamplesPerPixel * PlanarConfiguration的StripsPerImage等于2
  • 没有默认值。

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

StripOffsets

  • 标签= 273(111)十六进制
  • Type = word或dword
  • N = PlanarConfiguration的StripsPerImage等于1. = SamplesPerPixel * PlanarConfiguration的StripsPerImage等于2
  • 没有默认值。

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

RowsPerStrip

  • 标签= 278(116)十六进制
  • Type = word或dword
  • N = 1
  • 默认值为2 ** 32 - 1,实际上是无穷大。那就是 整个图像是一个条带。
  • 建议条带尺寸为8K。

每个条带的行数。图像数据被组织成 用于在数据时快速访问单个行的条带 压缩 - 尽管该字段有效,即使数据不是 压缩。

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