读取tiff文件的尺寸和分辨率,而不先加载它

如何在不首先使用如下代码将内容加载到内存中的情况下读取tiff文件的尺寸(宽度和高度)和分辨率(水平和垂直)。 它对于大文件来说太慢了,我不需要操纵它们。

Image tif = Image.FromFile(@"C:\large_size.tif"); float width = tif.PhysicalDimension.Width; float height = tif.PhysicalDimension.Height; float hresolution = tif.HorizontalResolution; float vresolution = tif.VerticalResolution; tif.Dispose(); 

编辑:

那些tiff文件是Bilevel,尺寸为30×42英寸。 文件大小约为1~2 MB。 所以上面的方法工作正常但速度慢。

自己进入这个并找到解决方案(可能在这里)。 使用validateImageData = false Image.FromStream允许您访问您正在查找的信息,而无需加载整个文件。

 using(FileStream stream = new FileStream(@"C:\large_size.tif", FileMode.Open, FileAccess.Read)) { using(Image tif = Image.FromStream(stream, false, false)) { float width = tif.PhysicalDimension.Width; float height = tif.PhysicalDimension.Height; float hresolution = tif.HorizontalResolution; float vresolution = tif.VerticalResolution; } } 

据我所知,System.Drawing命名空间中的所有类在图像打开时立即加载图像数据。

我认为LibTiff.Net可以帮助您在不加载图像数据的情况下读取图像属性。 它是免费的开源(BSD许可证,适用于商业应用)。

以下是您的任务示例(为简洁起见,省略了错误检查):

 using BitMiracle.LibTiff.Classic; namespace ReadTiffDimensions { class Program { static void Main(string[] args) { using (Tiff image = Tiff.Open(args[0], "r")) { FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH); int width = value[0].ToInt(); value = image.GetField(TiffTag.IMAGELENGTH); int height = value[0].ToInt(); value = image.GetField(TiffTag.XRESOLUTION); float dpiX = value[0].ToFloat(); value = image.GetField(TiffTag.YRESOLUTION); float dpiY = value[0].ToFloat(); } } } } 

免责声明:我是图书馆的维护者之一。

试试这个 ,它似乎是你在寻找的。 之后跳过所有内容:

 TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, ref w); //your width TIFFGetField(tif, TIFFTAG_IMAGELENGTH, ref h); //your height TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, ref bits); TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, ref samples); 

不要忘记关闭后:

 TIFFClose(tif); 

我能想到的唯一方法是读取tiff二进制头文件。

您可以在此处下载规范: http : //partners.adobe.com/public/developer/tiff/index.html

以下是一些用于阅读可用于学习的Tiff的代码: http : //www.koders.com/csharp/fidF6632006F25B8E5B3BCC62D13076B38D71847929.aspx? s =缩放

我不久前创建了一个库来读取tiff头文件(以这两个资源为基础),但它是我雇主代码的一部分,所以我不能在这里发布我的代码,我可以说这不是很难。

我希望这有帮助。