Dividir tiff multi-página con python

¿Cuál es la mejor manera de dividir un TIFF de varias páginas con python? PIL no parece tener soporte para imágenes de varias páginas, y no he encontrado un puerto exacto para libtiff para python. ¿PyLibTiff sería el camino a seguir? ¿Puede alguien proporcionar un ejemplo simple de cómo podría analizar varias páginas dentro de un TIFF?

Utilizo ImageMagick como progtwig externo para convertir faxes de varias páginas en PNG visibles:

/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 

convierte la primera página a PNG

aaa.tiff [1] sería la segunda página, y así sucesivamente.

O para extraer todas las imágenes, haz:

 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 

Por lo tanto, para dividir un TIFF de varias páginas en TIFF de varias páginas, tendría que ejecutar:

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

y luego trabajar con archivos temporales: /tmp/out-12345-*.tiff

Sin embargo, ImageMagick puede hacer mucho procesamiento, por lo que probablemente pueda lograr el resultado deseado con un solo comando.

Un proyecto (revelación: el cual soy uno de los autores principales, esta pregunta fue una de las cosas que me impulsó a trabajar en él) que hace que esto sea fácil es PIMS . El núcleo de PIMS es esencialmente una versión limpia y generalizada de la siguiente clase.

Una clase para hacer extracción básica de cuadros + iteración simple.

 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) 

Imagemgick me funcionó muy bien. Al dividir un archivo tiff, básicamente convertir de tiff a tiff, se puede usar una bandera para forzar el guardado de archivos de salida en archivos tiff individuales. Para hacer eso, intenta

 convert input.tif output-%d.tif 

El operador% d es un estilo C-Printf% d. Por lo tanto, si necesita una secuencia de ejecución de 3 campos, puede decir

 convert input.tif output-%3d.tif 

y así sucesivamente ..% d se reemplaza por el número de “escena” de la imagen. Ahora, los números de escena pueden o no comenzar siempre con 0 (o 1, si así lo desea). Para configurar una secuencia de la forma que desee, intente

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

Esto iniciaría la secuencia directamente desde el recuento que proporcionó.

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

Magick de hecho !! 🙂

Este enlace a la documentación tiene más detalles. Esto funciona en mi máquina de Windows también.

Lo siguiente divide un archivo tif con múltiples marcos en archivos tif donde cada archivo es un marco.

 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 

Podrías convertirlo a PDF y usar pyPDF para dividir las páginas.