2012-03-09 17 views
6

Qual è il modo migliore per dividere un TIFF multipagina con python? PIL non sembra avere supporto per le immagini multi-pagina, e non ho trovato una porta esatta per libtiff per python. PyLibTiff sarebbe la strada da percorrere? Qualcuno può fornire un semplice esempio di come posso analizzare più pagine all'interno di un TIFF?Split tiff multi-pagina con python

+0

PIL ha un supporto limitato ai documenti "multi-immagine" - è cana t almeno laod, e leat avete a che fare con, i singoli fotogrammi in GIF animate - Non so se il plug-in TIFF carico consente leggere ogni pagina, però. Puoi pubblicare un link a uno dei tuoi tiff? – jsbueno

+0

Purtroppo no ... Il materiale che sto trattando in questo momento è sensibile e non ho idea di come generare un tiff generico a più pagine da zero. Ho provato a esportare più livelli in gimp senza alcun risultato. Hai qualche esempio di codice? Potrei provarli sulla mia macchina. – user1145643

risposta

2

Io faccio uso ImageMagick come programma esterno per convertire più pagine di fax in visualizzabile 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 

si converte prima pagina PNG

aaa.tiff [1] sarebbe una seconda pagina e così via.

O per estrarre tutte le immagini, si fa:

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 

Così, per dividere una sola TIFF multipagina in molti TIFF si dovrà eseguire:

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

e poi lavorare con file temporanei: /tmp/out-12345-*.tiff

Tuttavia, ImageMagick può eseguire molte elaborazioni, quindi è possibile ottenere il risultato desiderato in un unico comando.

-1

Si potrebbe convertire in PDF e utilizzare pyPDF per dividere le pagine

+1

Preferisco non convertire in PDF, dividere e riconvertire in TIFF a meno che non ci sia assolutamente nessun altro modo per dividere i TIFF multipagina. Sembra un modo al contrario di estrarre singole pagine, ma sentitevi liberi di correggermi se ho torto ... – user1145643

6

Un progetto (divulgazione: quale io sono uno degli autori principali, questa domanda è stata una delle cose che mi ha spinto a lavorarci sopra) che rende questo è facile è PIMS. Il nucleo di PIMS è essenzialmente una versione pulita e generalizzata della classe seguente.

Una classe per l'estrazione di frame di base + iterazione semplice.

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

Qual è lo scopo del rimodellamento di Numpy? – speedplane

+0

@speedplane Perché 'getdata' restituisce un iterabile appiattito dell'immagine http://effbot.org/imagingbook/image.htm#tag-Image.Image.getdata – tacaswell

+0

@tacaswell Esiste un modo per convertire il frame estratto in png o jpeg i file dopo "get_frame()" sono terminati? – comproch

4

Imagemagick ha funzionato per me davvero bene. Per dividere un file tiff, in pratica la conversione da tiff a tiff, si può usare un flag per forzare il salvataggio dei file di output in singoli file tiff. Per farlo, prova

convert input.tif output-%d.tif 

L'operatore% d è uno stile C-Printf% d. Quindi, se avete bisogno di un 3 campo di sequenza in esecuzione, si può dire

convert input.tif output-%3d.tif 

e così via ..% d è sostituito dal numero "scena" dell'immagine. Ora, i numeri di scena possono o non possono sempre iniziare con 0 (o 1, se lo vuoi in quel modo). Per impostare una sequenza nel modo desiderato, prova

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

Ciò avvia la sequenza direttamente dal conteggio che hai fornito.

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

Magick davvero !! :)

This link alla documentazione ha maggiori dettagli. Funziona anche sulla mia macchina Windows.

1

Il seguente divide un file tif con più frame in file tif in cui ogni file è un frame.

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