2012-03-09 24 views
6

¿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. ¿Sería PyLibTiff el camino a seguir? ¿Alguien puede proporcionar un ejemplo simple de cómo puedo analizar varias páginas dentro de un TIFF?Split tiff de varias páginas con python

+0

PIL tiene un apoyo limitado a los documentos "multi-imagen" - se Cana t menos laod y LEAT a lidiar con, marcos individuales en GIF animados - No sé si el TIFF carga plug-in que permite para leer cada página, sin embargo. ¿Puedes publicar un enlace a uno de tus tiffs? – jsbueno

+0

Lamentablemente, no ... El material que estoy tratando ahora es delicado, y no tengo ni idea de cómo generar un tiff genérico de varias páginas desde cero. Intenté exportar varias capas en Gimp inútilmente. ¿Tienes algún ejemplo de código? Podría probarlos en mi máquina. – user1145643

Respuesta

2

hago uso de ImageMagick como programa externo para convertir varias páginas de fax en visible 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 

Cómo convierte primera página de PNG

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

O para extraer todas las imágenes, qué:

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 

lo tanto, para simplemente dividir un TIFF de varias páginas en muchas páginas TIFF que 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 un montón de procesamiento, por lo que probablemente pueda obtener el resultado deseado en un solo comando.

-1

Se podría convertirlo a PDF y utilizar pyPDF para dividir las páginas

+1

Prefiero no convertir a PDF, dividir y convertir de nuevo a TIFF a menos que no haya absolutamente ninguna otra manera de dividir archivos TIFF de varias páginas. Parece una forma inversa de extraer páginas individuales, pero no dude en corregirme si me equivoco ... – user1145643

6

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

Una clase para hacer extracción de marco básica + 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) 
+0

¿Cuál es el propósito de la modificación numpy? – speedplane

+0

@speedplane Porque 'getdata' devuelve un iterable aplanado de la imagen http://effbot.org/imagingbook/image.htm#tag-Image.Image.getdata – tacaswell

+0

@tacaswell ¿Hay alguna manera de convertir el marco extraído a png o jpeg archivos después de 'get_frame()' está hecho? – comproch

4

Imagemagick me funcionó bien real. Al dividir un archivo tiff, básicamente convirtiendo de tiff a tiff, se puede usar un indicador para forzar el guardado de archivos de salida en archivos tiff individuales. Para hacerlo, intente

convert input.tif output-%d.tif 

El operador% d es un estilo C-Printf% d. Por lo tanto, si necesita una secuencia de funcionamiento 3 campo, se puede decir

convert input.tif output-%3d.tif 

y así sucesivamente ..% d se sustituye 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 manera 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 indeed !! :)

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

1

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 
Cuestiones relacionadas