2012-01-25 23 views
13

Tôi đang tìm thư viện có thể mở và sao chép các phần của tệp TIFF lớn. Tôi đã xem LibTiff.Net mở tệp nhanh chóng nhưng không có bất kỳ chức năng nào để cắt xén hoặc sao chép các phần của hình ảnh. Hình ảnh của tôi có kích thước từ 100.000 x 100.000 pixel trở lên và tạo ra một System.Drawing.Bitmap kích thước đó treo ứng dụng để chuyển đổi thành một số Bitmap trước tiên không phải là một tùy chọn.Mở TIF lớn trong .NET và sao chép các bộ phận vào hình ảnh mới

Bất kỳ ai cũng có thể giới thiệu thư viện .NET không?

+0

Chúa ơi, đó là 40 * gigabyte *. Tôi cho rằng bạn chỉ có một hệ điều hành 32-bit để làm cho nó thêm khó khăn? –

+0

Tôi đang chạy trên phần cứng 64 bit nhưng đọc từ đĩa sẽ là cách lý tưởng để xử lý nó. Tôi đang nhìn sâu hơn vào LibTiff.Net có chức năng đọc scanline mà có thể là những gì tôi cần – JWood

+0

Là hình ảnh màu sắc, màu xám hoặc bilevel? Đối với bilevel tôi có một giải pháp mã nguồn gốc có thể giải quyết vấn đề bộ nhớ. Gửi email cho tôi ([email protected]). – BitBank

Trả lời

5

Nếu tệp của bạn nhỏ hơn 4GB trên đĩa hơn tôi khuyên bạn nên xem xét thêm LibTiff.Net. Ngay cả với những hình ảnh lớn như vậy bạn có một số tùy chọn.

Trước hết, hãy kiểm tra xem hình ảnh của bạn có được lát gạch hoặc tước không. Tiff.IsTiled phương pháp sẽ cung cấp cho bạn câu trả lời.

Nếu hình ảnh của bạn được lát, hơn bạn có thể không nên đọc bằng phương pháp ReadScanline. Nó có thể là tốt hơn để sử dụng phương pháp ReadEncodedTile trong trường hợp đó.

Nếu hình ảnh của bạn bị tước, bạn có thể sử dụng các phương thức ReadScanlineReadEncodedStrip để đọc.

Nếu bạn muốn sử dụng thứ gì đó mong đợi System.Drawing.Bitmap hơn hãy thử sử dụng ReadRGBATile hoặc ReadRGBAStrip. Các phương thức này có thể được sử dụng để tạo bitmap từ các phần của hình ảnh của bạn. Không có mẫu cho việc này, nhưng Convert color TIFF to a 32-bit System.Drawing.Bitmap sẽ cung cấp cho bạn hầu hết mọi thông tin bắt buộc về cách chuyển đổi hình xếp hoặc dải hình ảnh thành bitmap.

EDIT:

LibTiff.Net 2.4.508 thêm hỗ trợ cho BigTiff vì vậy các files lớn hơn 4GB cũng được hỗ trợ.

+0

Tôi đã có một hình ảnh lát gạch được nén JPG. Tôi muốn truy cập hình ảnh và viết lại. Tôi có đọc với ReadEncodedTile và viết với WriteTile hoặc WriteEncodedTile không? – Krip

+0

Tôi nhận được nó làm việc với ReadEncodedTile tiếp theo WriteEncodedTile. – Krip

4

Hình ảnh của bạn phải ở định dạng BigTIFF vì TIFF bình thường không được lớn hơn 4 GB.

BigTIFF có thể đọc bằng phiên bản sửa đổi của libtiff (có sẵn trong BigTIFF website), thư viện này cho phép xử lý các hình ảnh theo cách bạn muốn mà không tải tất cả dữ liệu pixel vào bộ nhớ.

Tôi không thấy các liên kết cho .NET nhưng không quá dài để thực hiện.

0

Atalasoft dotImage có khả năng này được tích hợp sẵn bộ giải mã TIFF. Giải mã thực hiện giao diện IRegionReadable, cho phép bạn đọc một phần hình chữ nhật từ một trang nhất định của một hình ảnh trong một luồng.

Trong TIFF, phần này sẽ tôn trọng thẻ định hướng và trong các tiff bị tước hoặc được lát gạch sử dụng bộ gạch và dải tối thiểu để lấp đầy hình chữ nhật.

(từ chối trách nhiệm, tôi làm việc cho Atalasoft và viết giao diện và thực hiện nó trong các bộ giải mã TIFF)

+0

Có thể với dotImage để mở tệp TIFF sử dụng hệ số tỷ lệ, giả sử 1/2 hoặc 1/4. Vì vậy, để nhanh chóng tạo hình thu nhỏ cho các tệp TIFF lớn? Tôi có thể cập nhật siêu dữ liệu các tệp TIFF lớn nhanh như thế nào? –

+0

Điều này là không thể trong trường hợp chung do các biến chứng từ ốp lát và định hướng hình ảnh. Tuy nhiên, chúng tôi thực hiện hầu hết những điều này khi xem xét triển khai giao diện IScaledDecoder để cho phép hình ảnh được đọc theo tỷ lệ, do đó, mặc dù trường hợp xấu nhất không thay đổi, các trường hợp tốt nhất được vinh danh. Đối với việc cập nhật siêu dữ liệu, bạn có gì nhanh? Đây là một quá trình liên kết IO. Dường như nó hoạt động tốt như tôi mong đợi. – plinth

+0

Vui lòng thông báo cho tôi khi bạn thêm khả năng này. Đây là lý do duy nhất tại sao tôi có thể chuyển từ thư viện xử lý TIFF hiện tại sang thư viện khác. –

0

Như Bobrovsky đề cập, bạn nên kiểm tra xem hình ảnh tập tin của bạn được lát gạch hay không. Trong phần tiếp theo, tôi đã trình bày đoạn mã để đọc một luồng tiff và cắt phần trên bên trái của hình ảnh.

using (Tiff input = Tiff.Open(@"imageFile.tif", "r")) 
     { 
      // get properties to use in writing output image file 
      int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
      int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
      int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt(); 
      int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt(); 
      int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt(); 

      int scanlineSize = input.ScanlineSize();  
      byte[][] buffer = new byte[height][]; 
      for (int i = 0; i < height; ++i) 
      { 
       buffer[i] = new byte[scanlineSize]; 
       input.ReadScanline(buffer[i], i); 
      } 



      using (Tiff output = Tiff.Open("splitedImage.tif", "w")) 
      { 
       output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel); 
       output.SetField(TiffTag.IMAGEWIDTH, width/2); 
       output.SetField(TiffTag.IMAGELENGTH, height/2); 
       output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample); 
       output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0)); 
       output.SetField(TiffTag.PHOTOMETRIC, photo); 
       output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); 


       int c = 0; 
       byte[][] holder = new byte[height][]; 

       for (int i = height/2; i < height; i++) 
       //for (int j = 0; j < height/2 ; j++) 
       { 
        holder[i] = buffer[i].Skip(buffer[i].Length/2).ToArray(); 

        output.WriteScanline(holder[i], c); 
        c++; 
       } 
      } 
     } 

     System.Diagnostics.Process.Start("splitedImage.tif"); 

Đối với các phần khác của hình ảnh, bạn có thể thay đổi phạm vi "i" trong vòng lặp.

Các vấn đề liên quan