2012-03-09 56 views
6

Cách tốt nhất để tách TIFF nhiều trang bằng python là gì? PIL dường như không có hỗ trợ cho hình ảnh nhiều trang, và tôi đã không tìm thấy một cổng chính xác cho libtiff cho python. Liệu PyLibTiff có phải là con đường để đi? Ai đó có thể cung cấp một ví dụ đơn giản về cách tôi có thể phân tích cú pháp nhiều trang trong một TIFF?Tách nhiều trang với python

+0

PIL hỗ trợ giới hạn cho các tài liệu "nhiều hình ảnh" - ít nhất là bạn phải xử lý, các khung riêng lẻ trong GIF động - Tôi không biết liệu plugin tải TIFF có cho phép bạn không để đọc từng trang. Bạn có thể gửi một liên kết đến một trong những tiffs của bạn? – jsbueno

+0

Thật không may là ... Tài liệu mà tôi đang xử lý ngay bây giờ là nhạy cảm và tôi không có đầu mối về cách tạo một tiff nhiều trang chung từ đầu. Tôi đã thử xuất nhiều lớp trong gimp để không có kết quả. Bạn có bất kỳ ví dụ mã nào không? Tôi có thể thử chúng trên máy của tôi. – user1145643

Trả lời

2

Tôi sử dụng ImageMagick là chương trình bên ngoài để chuyển đổi fax nhiều trang vào xem PNG:

/usr/bin/convert /var/voip/fax/out/2012/04/fax_out_L1_17.tiff[0] -scale 50x100% -depth 16 /tmp/fax_images/fax_out_L1_17-0-m.png 

không chuyển đổi trang đầu tiên PNG

aaa.tiff [1] sẽ là trang thứ hai, v.v.

Hoặc để trích xuất tất cả hình ảnh, làm:

convert -verbose fax_in_L1-1333564876.469.tiff a.png 
fax_in_L1-1333564876.469.tiff[0] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.030u 0:00.030 
fax_in_L1-1333564876.469.tiff[1] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.020u 0:00.010 
fax_in_L1-1333564876.469.tiff[2] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.020u 0:00.010 
fax_in_L1-1333564876.469.tiff=>a-0.png[0] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 12KiB 0.030u 0:00.019 
fax_in_L1-1333564876.469.tiff=>a-1.png[1] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 8KiB 0.040u 0:00.039 
fax_in_L1-1333564876.469.tiff=>a-2.png[2] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 32KiB 0.070u 0:00.070 

Vì vậy, để chỉ chia nhỏ một TIFF nhiều trang thành nhiều trang TIFF bạn sẽ phải thực hiện:

convert in-12345.tiff /tmp/out-12345.tiff 

và sau đó làm việc với các tệp tạm thời: /tmp/out-12345-*.tiff

Tuy nhiên ImageMagick có thể thực hiện nhiều thao tác, vì vậy bạn có thể đạt được kết quả mong muốn trong một lệnh.

-1

Bạn có thể chuyển đổi nó sang PDF và sử dụng pyPDF để phân chia các trang

+1

Tôi không chuyển đổi sang PDF, tách và chuyển đổi về TIFF trừ khi hoàn toàn không có cách nào khác để tách TIFF nhiều trang. Nó có vẻ giống như một cách ngược lại để trích xuất các trang riêng lẻ, nhưng cảm thấy tự do để sửa tôi nếu tôi sai ... – user1145643

6

Một dự án (tiết lộ: tôi là một trong những tác giả chính, câu hỏi này là một trong những điều khiến tôi làm việc), điều này dễ dàng là PIMS. Cốt lõi của PIMS về bản chất là một phiên bản được dọn dẹp và tổng quát của lớp sau.

Một lớp học để thực hiện trích xuất khung cơ bản + lặp lại đơn giản.

import PIL.Image 
class Stack_wrapper(object): 
    def __init__(self,fname): 
     '''fname is the full path ''' 
     self.im = PIL.Image.open(fname) 

     self.im.seek(0) 
     # get image dimensions from the meta data the order is flipped 
     # due to row major v col major ordering in tiffs and numpy 
     self.im_sz = [self.im.tag[0x101][0], 
         self.im.tag[0x100][0]] 
     self.cur = self.im.tell() 

    def get_frame(self,j): 
     '''Extracts the jth frame from the image sequence. 
     if the frame does not exist return None''' 
     try: 
      self.im.seek(j) 
     except EOFError: 
      return None 

     self.cur = self.im.tell() 
     return np.reshape(self.im.getdata(),self.im_sz) 
    def __iter__(self): 
     self.im.seek(0) 
     self.old = self.cur 
     self.cur = self.im.tell() 
     return self 

    def next(self): 
     try: 
      self.im.seek(self.cur) 
      self.cur = self.im.tell()+1 
     except EOFError: 
      self.im.seek(self.old) 
      self.cur = self.im.tell() 
      raise StopIteration 
     return np.reshape(self.im.getdata(),self.im_sz) 
+0

Mục đích của việc định hình lại là gì? – speedplane

+0

@speedplane Vì 'getdata' trả về dạng lặp có thể lặp lại của hình ảnh http://effbot.org/imagingbook/image.htm#tag-Image.Image.getdata – tacaswell

+0

@tacaswell Có cách nào để chuyển đổi khung được trích xuất thành png hoặc jpeg không tập tin sau khi 'get_frame()' được thực hiện? – comproch

4

Imagemagick làm việc cho tôi thực sự tốt. Wnen tách một tệp tiff, về cơ bản chuyển đổi từ tiff sang tiff, người ta có thể sử dụng một lá cờ để buộc lưu các tệp đầu ra vào các tệp tiff riêng lẻ. Để làm điều đó, hãy thử

convert input.tif output-%d.tif 

Toán tử% d là kiểu C-Printf% d. Vì vậy, nếu bạn cần chuỗi chạy 3 trường, bạn có thể nói

convert input.tif output-%3d.tif 

và cứ thế ..% d được thay thế bằng số "cảnh" của hình ảnh. Bây giờ, số cảnh có thể hoặc không thể luôn bắt đầu bằng 0 (hoặc 1, nếu bạn muốn theo cách đó). Để thiết lập trình tự theo cách bạn muốn, hãy thử

convert input.tif -scene 1 output-%3d.tif 

Điều này sẽ bắt đầu chuỗi ngay từ số bạn đã cung cấp.

convert -scene 1 input.TIF output-%d.TIF 
output-1.TIF 
output-2.TIF 
output-3.TIF 

Magick !! :)

This link vào tài liệu có nhiều chi tiết hơn. Điều này làm việc trên máy tính của tôi cửa sổ quá.

1

Sau đây chia tách tệp tif với nhiều khung thành các tệp tif trong đó mỗi tệp là một khung.

def parse_tif(filePath): 
    img = Image.open(filePath) 
    for i in range (numFramesPerTif): 
     try: 
      img.seek(i) 
      img.save('Block_%s.tif'%(i,)) 
     except EOFError: #end of file error 
Các vấn đề liên quan