2010-10-29 12 views
8

So lesen Sie die Dimension (Breite und Höhe) und Auflösung (horizontal und vertikal) einer TIFF-Datei, ohne sie zuerst in den Speicher zu laden. Für große Dateien ist es zu langsam und ich muss sie nicht manipulieren.Lesen Sie die Dimension und Auflösung einer TIFF-Datei, ohne sie zuerst zu laden

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

Edit:

Those TIFF-Dateien sind Bilevel und haben eine Abmessung von 30x42 Zoll. Die Dateigröße beträgt ca. 1-2 MB. Also funktioniert die obige Methode Ok aber langsam.

Antwort

10

Bin selbst hineingelaufen und habe die Lösung gefunden (möglicherweise hier). Image.FromStream mit validateImageData = false ermöglicht Ihnen den Zugriff auf die Informationen, die Sie suchen, ohne die gesamte Datei zu laden.

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

Ich habe nur Ihre Kommentare gesehen. Ich habe es versucht und du hast Recht. Die Methode ist viel schneller als die in meiner ursprünglichen Frage verwendete. Vielen Dank. – z1x2

1

Versuchen Sie this, es scheint zu sein, was Sie suchen. Einfach alles überspringt nach:

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

nicht, nachdem Sie schließen Vergessen:

TIFFClose(tif); 
+0

Ihr Code erfordert LibTiff.Net – z1x2

+0

ich eine Teillösung der Verwendung Shell32.Folder.GetDetailsOf (gefunden). Aber es kann nur Dimension, aber keine Auflösung unter Windows XP erhalten. Vielen Dank. – z1x2

1

Die einzige Möglichkeit, die ich denken kann, um die TIFF-Binär-Header zu lesen.

Hier können Sie die Spezifikation herunterladen: http://partners.adobe.com/public/developer/tiff/index.html

Hier ist ein Code verwendet Tiffs zu lesen, die Sie lernen können: http://www.koders.com/csharp/fidF6632006F25B8E5B3BCC62D13076B38D71847929.aspx?s=zoom

ich eine Bibliothek erstellt vor dem TIFF-Header einige Zeit zu lesen (mit diesen zwei Ressourcen als Basis) aber es war Teil meines Arbeitgebercodes, also kann ich meinen Code hier nicht posten und ich kann sagen, dass es nicht wirklich schwierig ist.

Ich hoffe, das hilft.

+0

Danke, dass Sie mich in die richtige Richtung weisen. Ich habe ungefähr Materialien auf beiden Links gelesen. Aber im Moment zögere ich, Zeit zu investieren, um die Lösung von Grund auf zu erstellen, weil ich nicht viel Erfahrung in der Programmierung auf Bit-zu-Bit-Ebene habe. – z1x2

+0

Ich werde WPF Imaging Component dafür versuchen, bevor Sie das Projekt beenden. Ich werde wahrscheinlich die von Ihnen zur Verfügung gestellten Informationen verwenden, um eine Lösung für die Ausübung meiner Freizeit zu programmieren. – z1x2

2

Soweit ich weiß, laden alle Klassen aus System.Drawing-Namespace Bilddaten sofort, wenn das Bild geöffnet ist.

Ich denke LibTiff.Net kann Ihnen helfen, Bildeigenschaften zu lesen, ohne Bilddaten zu laden. Es ist kostenlos und Open-Source (BSD-Lizenz, geeignet für kommerzielle Anwendungen).

Hier ist ein Beispiel für Ihre Aufgabe ist (Fehlerprüfungen der Kürze halber weggelassen):

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

Disclaimer: Ich bin einer der Maintainer der Bibliothek.

+0

Danke für die Präsentation des Codes. Ich denke, LibTiff.Net ist wahrscheinlich die einzige Open-Source-Option für nicht-kommerzielle Nutzung. Mein Programm ist ein kleines einzelnes Programm von weniger als 30k. Die Verarbeitung von TIFF-Dateien ist nicht seine Hauptaufgabe.Ich bleibe lieber bei meiner jetzigen langsamen, aber einfachen Lösung. – z1x2

Verwandte Themen