2009-12-09 8 views
3

J'avais une image TIFF multipage numérisée et j'avais besoin de diviser chaque page en fichiers individuels. C'est facile à faire en utilisant le framework .NET et C#, mais comme je n'avais pas tous les outils de développement installés sur la machine que j'utilisais, j'ai plutôt choisi d'utiliser IronPython (via ipy.exe) pour Écris rapidement la logique de traitement.Division d'une image TIFF multipage - Avec .NET et IronPython

En utilisant Stack Overflow comme un moteur de «blog», je fournirai une réponse à ma propre question. Les commentaires, suggestions, alternatives, etc. sont les bienvenus!

Répondre

3

Voici une façon de procéder: modifiez au besoin.


import clr 
clr.AddReference("System.Drawing") 

from System.Drawing import Image 
from System.Drawing.Imaging import FrameDimension 
from System.IO import Path 

# sourceFilePath - The full path to the tif image on disk (e.g path = r"C:\files\multipage.tif") 
# outputDir - The directory to store the individual files. Each output file is suffixed with its page number. 
def splitImage(sourceFilePath, outputDir): 
    img = Image.FromFile(sourceFilePath) 

    for i in range(0, img.GetFrameCount(FrameDimension.Page)): 

     name = Path.GetFileNameWithoutExtension(sourceFilePath) 
     ext = Path.GetExtension(sourceFilePath) 
     outputFilePath = Path.Combine(outputDir, name + "_" + str(i+1) + ext) 

     frameDimensionId = img.FrameDimensionsList[0] 
     frameDimension = FrameDimension(frameDimensionId) 

     img.SelectActiveFrame(frameDimension, i) 
     img.Save(outputFilePath, ImageFormat.Tiff) 
1

Un inconvénient de cette façon de faire est que les données d'image ont été décompressés puis re-comprimé quand il a été enregistré. Ce n'est pas un problème si votre compression est sans perte (juste le temps et la mémoire), mais si vous utilisez la compression JPEG pour les images à l'intérieur du TIFF, vous perdrez de la qualité.

Il existe des moyens de le faire en utilisant libtiff directement - je ne connais pas d'autres outils non commerciaux qui peuvent le faire. Fondamentalement, vous devez trouver les entrées du répertoire TIFF dans le fichier qui se rapportent aux données d'image et les copier directement dans un nouveau TIFF sans les décoder et les réencoder. En fonction de ce que vous voulez faire, vous devrez peut-être corriger les décalages dans les entrées (par exemple, si vous introduisez également les méta-données)

Si vous souhaitez scinder, fusionner, supprimer des pages ou réorganiser les documents TIFF sans perte de qualité (et aussi plus rapidement et en utilisant moins de mémoire), jetez un oeil au produit de ma société, DotImage, et regardez la classe TiffDocument. This CodeProject article shows how to do it.

Questions connexes