2010-10-29 17 views
8

Jak odczytać wymiary pliku tiff (szerokość i wysokość) i rozdzielczość (poziomą i pionową) bez wcześniejszego załadowania do pamięci za pomocą kodu podobnego do poniższego. Jest zbyt wolny w przypadku dużych plików i nie trzeba ich modyfikować.Odczytywanie rozmiaru i rozdzielczości pliku TIFF bez załadowania go najpierw

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 są bilevel i mają wymiar 30x42 cali. Rozmiary plików wynoszą około 1 ~ 2 MB. Tak więc powyższa metoda działa Ok, ale wolno.

Odpowiedz

10

Zrobiłem to sam i znalazłem rozwiązanie (prawdopodobnie tutaj). Image.FromStream z validateImageData = false pozwala uzyskać dostęp do informacji, których szukasz, bez ładowania całego pliku.

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

Właśnie zobaczyłem twoje komentarze. Próbowałem i masz rację. Ta metoda jest znacznie szybsza niż ta zastosowana w moim oryginalnym pytaniu. Dzięki. – z1x2

1

Spróbuj this, wygląda na to, czego szukasz. Wszystko po prostu pominąć:

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

Nie zapomnij zamknąć za wami

TIFFClose(tif); 
+0

Kod wymaga LibTiff.Net – z1x2

+0

znalazłem częściowe rozwiązanie korzystania Shell32.Folder.GetDetailsOf(). Ale może uzyskać tylko wymiar, ale nie rozdzielczość w systemie Windows XP. Dzięki. – z1x2

1

Jedynym sposobem mogę myśleć czyta tiff nagłówek binarny.

Tutaj można pobrać specyfikację: http://partners.adobe.com/public/developer/tiff/index.html

Oto kod używany do odczytu TIFF, które można wykorzystać do nauki: http://www.koders.com/csharp/fidF6632006F25B8E5B3BCC62D13076B38D71847929.aspx?s=zoom

stworzyłem bibliotekę czytać nagłówki tiff jakiś czas temu (z tymi dwoma zasobami jako bazą), ale było to częścią mojego kodu pracodawcy, więc nie mogę opublikować mojego kodu tutaj i mogę powiedzieć, że to naprawdę nie jest trudne.

Mam nadzieję, że to pomoże.

+0

Dzięki za skierowanie mnie we właściwym kierunku. Z grubsza czytałem materiały na obu linkach. Ale teraz wahałem się poświęcić czas na stworzenie rozwiązania od zera, ponieważ nie mam dużego doświadczenia w programowaniu na poziomie bit-to-bit. – z1x2

+0

Spróbuję do tego komponentu WPF Imaging Component przed ukończeniem projektu. Prawdopodobnie wykorzystam dostarczone przez ciebie informacje, aby zakodować rozwiązanie do ćwiczeń w moim własnym czasie. – z1x2

2

O ile mi wiadomo, wszystkie klasy z przestrzeni nazw System.Drawing ładują dane obrazu natychmiast po otwarciu obrazu.

Myślę, że LibTiff.Net może pomóc w odczytaniu właściwości obrazu bez wczytywania danych obrazu. Jest bezpłatny i open-source (licencja BSD, odpowiednia dla aplikacji komercyjnych).

Oto przykład dla zadania (sprawdza błędów są pominięte dla zwięzłości):

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

Zastrzeżenie: Jestem jednym z opiekunów biblioteki.

+0

Dziękujemy za przedstawienie kodu. Myślę, że LibTiff.Net to prawdopodobnie jedyny otwarty wybór do użytku niekomercyjnego. Mój program to malutki pojedynczy program mniejszy niż 30k. Przetwarzanie plików tiff nie jest jego głównym zadaniem.Więc teraz wolę teraz trzymać się mojego obecnego, ale prostego rozwiązania. – z1x2

Powiązane problemy