2010-01-11 3 views
9

Ich möchte LibTiff verwenden, um auf sehr große TIFF-Dateien zuzugreifen. Ich brauche Funktionen wie mehrere Seiten und Kacheln, und so scheint LibTiff der richtige Weg zu sein. Kann mir jemand helfen, LibTiff von C# zu benutzen? Ich habe einige Links gefunden (wie blog.bee-ee, die teilweise Code enthielten. Aber ich konnte nicht über eine Version hinauskommen. Ich habe mir FreeImage angesehen, fand es aber nicht geeignet (Bilder sind ca. 800 MPixel 8 oder 16 Bit Graustufen - > 800-1600 MByte) Größe und ich kann es nicht im Speicher in einer 32-Bit-Umgebung laden)Verwenden von LibTiff von C# (um auf gekachelte TIFF-Bilder zuzugreifen)

Ich bin sehr erfahren in C/C++, aber noch nicht in C#. Kann mir jemand einen Umschlag oder Hinweise geben?

Hinweis: Ich brauche Seiten für den Zugriff auf pyramidenförmige Ebenen (Multi-Resolution) in einem TIFF und Kacheln von 256x256, um schnellen Zugriff auf verschiedene Teile des Bildes zu haben, ohne es sofort zu laden.

[Bearbeiten] Die LibTIFF.NET Lösung schien am praktischsten für mich. Ich bin jetzt dabei, es in eine Produktentwicklung zu integrieren, und es wird mir wahrscheinlich viele Kopfschmerzen ersparen, wenn ich den verwalteten Speicher betrete. Ich habe die Callback-Funktion noch nicht ausprobiert, die anscheinend in .net-Form gut gelöst ist. Danke für die Hilfe auf stackoverflow [/ Edit]

Antwort

6

Sie können unser LibTiff.Net ausprobieren. Es ist eine freie und quelloffene Version von LibTiff, die mit verwaltetem C# geschrieben wurde. Die API unserer Implementierung ist der Originalversion sehr ähnlich.

http://bitmiracle.com/libtiff/

Wir haben es gerade freigegeben, so kann es sein Fehler. Aber voller Quellcode kommt mit einer Reihe von Tests, so dass die meisten offensichtlichen Fehler behoben werden sollten.

+0

Danke. Meine ersten Tests sehen gut aus. Obwohl ich eine Wrapper-Klasse gefunden habe, hatte sie keinen bekannten Autor und ich würde früher oder später Probleme mit dem Zugriff auf verwaltete/nicht gemanagte Speicherressourcen bekommen. Benchmarks zeigten mir eine gleichwertige Leistung beim Lesen von nicht komprimierten Dateien und einen 50% Performance-Hit bei komprimierten, pyramidenförmigen Adobe-Tiffs. Das ist akzeptabel für mich. Ich entscheide mich, keine Komprimierung zu verwenden, und ich werde besser sein, meine Software mehrkernfreundlich zu machen, als Speicherprobleme zu lösen. – Adriaan

+0

Vielen Dank, Adriaan unsere Implementierung ist definitiv langsamer als die ursprüngliche Sprache der Wahl :-) – Bobrovsky

+0

Es stört mich nicht. Für mein Projekt bedeutet Performance Funktionalität/Euro. Und Entwicklungsstunden sind 95% der Kosten. Ich kann einfach einen Quadcore einwerfen, um das auszugleichen. Außerdem, wenn ich mich von der Kompression fern halte, ist der Unterschied gering. Und meine Dateien komprimieren nur etwa 10%, das sind also nur 100Myte pro Datei ;-) – Adriaan

4

WIC bietet Unterstützung für sehr große Bilddateien. Es gibt einen schönen Wrapper dafür im .NET Framework: TiffBitmapDecoder.

+1

Können Sie einige Links hinzufügen? Von dem, was ich gesehen habe, versucht TiffBitmapDecoder, ein Bild im Speicher sofort zu laden. Ich kann das nicht tun. Bilder> 1 GByte werden auf einer 32-Bit-Maschine aufgrund von Fragmentierung immer fehlschlagen. beziehen Sie sich auf Windows7-Besonderheiten (http://msdn.microsoft.com/en-us/library/ee720061%28VS.85%29.aspx)? – Adriaan

+0

Nein, TBD speichert kein Bild. Beginnen Sie hier: http://msdn.microsoft.com/en-us/library/ms748873.aspx –

+0

Danke für Ihre Hilfe. Leider ist meine Erfahrung anders. Die Schritte, die in http://msdn.microsoft.com/en-us/library/ms748873.aspx beschrieben werden, versuchen, einen einzelnen Speicherblock mit der Größe des 1 Rahmens der Bitmap zuzuweisen. Ich benötige Zugriff auf jedes Pixel in die Bitmap (also keine Speicheroption zum Speichern auf dem Bildschirm), nur nicht unbedingt in einem Stück Speicher. Wenn ich versuche, den TIFF-Decoder wie im Beispiel angegeben auszuführen, schlägt es im Allgemeinen bei Bitmaps> 10k * 10k fehl. Und das sind nur meine kleinen Testdateien. Mein Ziel ist 800MPixel x 16 Bit. Deshalb suche ich nach gekachelten TIFF-Dateien. – Adriaan

1

Meine ursprüngliche Lösung bestand darin, einen C# .NET-Wrapper für die LibTIFF-DLL zu verwenden. Ich habe es auf libtiff ftp gefunden. Es scheint alle wichtigen Methoden der LIBTiff-Bibliothek zu enthalten. Es behält Speicher im nicht verwalteten LibTIFF-Speicher; Das bedeutet, dass der C# -Code dies berücksichtigen und Daten kopieren muss, wenn er in einem sicheren Code verarbeitet werden muss.

Mein ‚Kachel Lesecode‘ zu testen wie

lesen
if (LibTIFF.IsTiled(tiff)) 
{ 
    if (LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILEWIDTH, out tileWidth) && 
     LibTIFF.GetField(tiff, (int)TIFFTags.TIFFTAG_TILELENGTH, out tileLength)) 
    { 
     uint tiles = 0; 
     IntPtr pTile = LibTIFF._malloc((int)(tileLength*tileWidth*bitsPerSample/2)); 
     for (uint y = 0; y < imageLength; y += tileLength) 
     { 
      for (uint x = 0; x < imageWidth; x += tileWidth) 
      { 
       LibTIFF.ReadTile(tiff, pTile, x, y, 0, 0); 
       tiles++; 
      } 
     }       
     LibTIFF._free(pTile); 
    } 
} 

Ich werde zwar für die .NET-Port von LibTIFF gehen, aber diese Lösung kann die richtige für andere Menschen sein, also lasse ich es auf StackOverflow.

+0

Ist 'LibTiff' die einzige Möglichkeit, Tiled TIFF zu verarbeiten? oder können wir dasselbe mit der TiffBitmapDecoder-Klasse in .Net Framework machen? –

+0

Was ich sehen kann, bietet der TiffBitMapDecoder keine Funktionalität zum selektiven Laden von Teilen der Datei (nur zum Rendern kompletter Frames). http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.tiffbitmapdecoder(v=vs.110).aspx – Adriaan

Verwandte Themen