2010-10-29 15 views
8

Cómo leer la dimensión (ancho y alto) y la resolución (horizontal y vertical) de un archivo TIFF sin cargarlo primero en la memoria usando un código como el siguiente. Es demasiado lento para archivos grandes y no necesito manipularlos.Lea la dimensión y la resolución de un archivo tiff sin cargarlo primero

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(); 

Editar:

Esos archivos TIFF son de dos niveles y tiene una dimensión de 30x42 pulgadas. Los tamaños de archivo son aproximadamente 1 ~ 2 MB. Entonces, el método anterior funciona bien, pero lento.

Respuesta

10

Me metí en esto y encontré la solución (posiblemente aquí). Image.FromStream con validateImageData = false le permite acceder a la información que está buscando, sin cargar todo el archivo.

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; 
    } 
} 
+0

Acabo de ver sus comentarios. Lo intenté y tienes razón. El método es mucho más rápido que el utilizado en mi pregunta original. Gracias. – z1x2

1

Prueba this, parece ser lo que estás buscando. Acaba de saltar después de todo:

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); 

No se olvide de cerrar después de que:

TIFFClose(tif); 
+0

Su código requiere LibTiff.Net – z1x2

+0

he encontrado una solución parcial de utilizar Shell32.Folder.GetDetailsOf(). Pero solo puede obtener dimensiones pero no resolución en Windows XP. Gracias. – z1x2

1

La única manera que puedo pensar es la lectura de la cabecera binaria tiff.

Aquí puede descargar la especificación: http://partners.adobe.com/public/developer/tiff/index.html

Aquí hay un código utilizado para leer Tiffs que se puede utilizar para aprender: http://www.koders.com/csharp/fidF6632006F25B8E5B3BCC62D13076B38D71847929.aspx?s=zoom

he creado una biblioteca para leer los encabezados tiff hace algún tiempo (con estos dos recursos como base) pero era parte del código de mi empleador, así que no puedo publicar mi código aquí y puedo decir que no es realmente difícil.

Espero que esto ayude.

+0

Gracias por indicarme la dirección correcta. He leído aproximadamente materiales en ambos enlaces. Pero en este momento dudo en dedicar tiempo a crear la solución desde el principio, porque no tengo mucha experiencia en programación a nivel de bit a bit. – z1x2

+0

Voy a probar WPF Imaging Component para esto antes de finalizar el proyecto. Probablemente usaré la información que me proporcionó para codificar una solución de ejercicio en mi propio tiempo. – z1x2

2

Hasta donde yo sé, todas las clases del espacio de nombres System.Drawing cargan datos de imagen inmediatamente cuando la imagen está abierta.

Creo que LibTiff.Net puede ayudarlo a leer las propiedades de la imagen sin cargar datos de imagen. Es gratuito y de código abierto (licencia BSD, adecuado para aplicaciones comerciales).

Este es un ejemplo para la tarea (comprobaciones de errores se omiten por razones de brevedad):

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(); 
      } 
     } 
    } 
} 

responsabilidad: yo soy uno de los encargados del mantenimiento de la biblioteca.

+0

Gracias por presentar el código. Creo que LibTiff.Net es probablemente la única opción de código abierto disponible para uso no comercial. Mi programa es un pequeño programa individual de menos de 30k. Procesar archivos tiff no es su tarea principal.Así que en este momento prefiero quedarme con mi actual solución lenta pero simple. – z1x2

Cuestiones relacionadas