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
Trả lời
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.
Bạn có thể chuyển đổi nó sang PDF và sử dụng pyPDF để phân chia các trang
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
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)
Mục đích của việc định hình lại là gì? – speedplane
@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
@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
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á.
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
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
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