2009-12-15 35 views
5

Tôi hiện đang làm việc trên một dự án yêu cầu tôi chia ảnh TIFF thành tệp có chứa tất cả các thẻ và tệp chứa tất cả dữ liệu hình ảnh và tạo lại hình ảnh TIFF từ các tệp này . Vấn đề duy nhất là có vẻ như LibTIFF không cung cấp cách nào dễ dàng để lấy tất cả các thẻ từ một hình ảnh. Tôi đã thử sử dụng TIFFGetTagListCount và sau đó TIFFGetField để lấy thẻ, nhưng điều này chỉ trả về một tập nhỏ các thẻ. Tôi đã bắt đầu lăn phiên bản của riêng mình, nhưng tôi chỉ muốn kiểm tra lại và chắc chắn rằng tôi không nhìn thấy một cái gì đó như thế này có vẻ như một tính năng khá rõ ràng mà nên được bao gồm trong thư viện.LibTIFF: Trích xuất tất cả các thẻ từ một hình ảnh TIFF

+0

Ngoài sự tò mò, bạn có tìm thấy giải pháp cho vấn đề này không? –

Trả lời

1

addingtags.html in the libtiff documentation chứa thông tin về cách xử lý thẻ không chuẩn (theo mặc định chúng bị bỏ qua). Có thể đó là vấn đề?

+0

Thẻ không chuẩn không phải là vấn đề thực sự, vì các thẻ tiêu chuẩn đơn giản như TIFF_IMAGEWIDTH và TIFF_IMAGELENGTH dường như không được bao gồm trong số danh sách thẻ. Nó thực sự khá lạ. –

1

Bạn có thể sử dụng trường tif_dir của hình ảnh. Nó là một struct với ít nhất các lĩnh vực sau:

  • td_customValueCount chứa số 'tùy chỉnh' đếm thẻ,
  • td_customValues là danh sách các td_customValueCount giá trị thẻ (lập chỉ mục từ 0), và là loại TIFFTagValue * .

Vì vậy, bạn sẽ có thể làm điều gì đó như thế này (trong thời trang thực sự của mã trực tuyến, đây là chưa được kiểm tra, tất nhiên!):

for (i=0; i < tiffimage->tif_dir->td_customValueCount; ++i) { 
    const TIFFFieldInfo *info = tiffimage->tif_dir->td_customValues[i].info; 
    const char *tagname = info->field_name(); 
    /* process tag */ 
} 

Xem TIFFDirectory Struct Reference. Hy vọng rằng sẽ giúp.

0

Tiện ích tiffdump (được giao với libtiff) hoàn thành điều này, nhưng nhìn vào mã, có vẻ như chúng hầu như đang làm việc quanh thư viện. Họ thực sự gọi số lseekread để đọc thông tin thẻ.

4

In tất cả các thẻ với tifffile.py:

from tifffile import TiffFile 
for page in TiffFile(path_to_file): 
    for tag in page.tags.values(): 
     print tag.name, tag.code, tag.dtype, tag.count, tag.value 
5

Dưới đây là đóng cửa, bạn có thể nhận được cho quét tất cả các thẻ:

#include "LibTIFF/tif_dir.h" 
... 

TIFFDirectory *td = &tif->tif_dir; 

for (int fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) { 
    const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi]; 

    // test if tag value is set 
    // (lifted directly form LibTiff _TIFFWriteDirectory) 

     if(fip->field_bit == FIELD_CUSTOM) { 
      int ci, is_set = FALSE; 

      for(ci = 0; ci < td->td_customValueCount; ci++) 
       is_set |= (td->td_customValues[ci].info == fip); 

      if(!is_set) 
       continue; 
     } else if(!TIFFFieldSet(tif, fip->field_bit)) 
      continue; 

     // else: process the fip->field_tag 


    } 

Lưu ý rằng bạn sẽ phải tính đến một số thẻ sẽ xuất hiện hai lần (phiên bản LONG và SHORT), nhưng chỉ một trong số này sẽ có giá trị. Loại chính xác để sử dụng có thể được tra cứu trong tiêu đề được bao gồm (cấu trúc TIFFDirectory).

Ngoài ra còn có các sản phẩm đánh bắt khác về cách đọc các thẻ, nhưng ít nhất điều này sẽ giúp bạn lặp lại tất cả các thẻ (các tiêu chuẩn). Xem tif_dirinfo.c cho con trỏ nếu bạn gặp khó khăn.

+0

Cũng vì 'tif_dir.h' là một tiêu đề nội bộ (tức là không được thư viện dựng sẵn), bao gồm nó gây ra mọi vấn đề như định nghĩa lại, thiếu phụ thuộc, vv. –

+0

@Anish Ramaswamy Không phải là tôi biết. Như đã nói, điều này được thiết kế ngược từ nguồn LibTIFF. Nếu bạn có vấn đề với định nghĩa lại, hãy thử cách ly nó trong đơn vị dịch thuật riêng biệt hoặc một thư viện nhỏ.Đối với thiếu từ chối. - khác bao gồm phải được thêm vào là tốt. IIRC, chỉ tiêu đề sẽ làm, không cần biên dịch bất kỳ .c từ thư viện. – user362515

+0

Điều đó dường như không phù hợp. Tôi vẫn đang đi săn. Cảm ơn! –

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