Solución:
Un proyecto (divulgación: del que soy uno de los principales autores, 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 de cuadros 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)
Imagemagick me funcionó muy bien. Cuando se divide un archivo tiff, básicamente convirtiéndolo de tiff a tiff, se puede usar una bandera para forzar el guardado de los 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. Entonces, 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 comenzar o no 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 desde el recuento que proporcionó.
convert -scene 1 input.TIF output-%d.TIF
output-1.TIF
output-2.TIF
output-3.TIF
¡Magia de hecho! 🙂
Este enlace a la documentación tiene más detalles. Esto también funciona en mi máquina con Windows.
Utilizo ImageMagick como programa 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, haga:
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 muchas 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 realizar mucho procesamiento, por lo que probablemente pueda lograr el resultado deseado con un solo comando.