3

スキャンした複数ページの TIFF 画像があり、各ページを個別のファイルに分割する必要がありました。

これは、.NET フレームワークと C# を利用することで簡単に実行できますが、使用しているマシンにすべての開発ツールがインストールされていなかったため、代わりに IronPython (ipy.exe 経由) を使用して処理をすばやくスクリプト化することにしました。論理。

Stack Overflow を「ブログ」エンジンとして使用して、私自身の質問に答えます。コメント、提案、代替案などを歓迎します!

4

2 に答える 2

3

これを行う 1 つの方法を次に示します。必要に応じて微調整します。


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)
于 2009-12-09T22:48:20.143 に答える
1

この方法の欠点の 1 つは、画像データが解凍され、保存時に再圧縮されることです。圧縮が無損失 (時間とメモリのみ) の場合、これは問題ではありませんが、TIFF 内の画像に JPEG 圧縮を使用している場合は、品質が低下します。

libtiff を直接使用してこれを行う方法があります。それができる他の非商用ツールは知りません。基本的に、画像データに関連するファイル内の TIFF ディレクトリ エントリを検索し、それらをデコードして再エンコードせずに新しい TIFF に直接コピーする必要があります。やりたいことの量によっては、エントリのオフセットを修正する必要がある場合があります (たとえば、メタデータも引き継いでいる場合)。

TIFF ドキュメントの分割、結合、ページの削除、並べ替えを品質を落とさずに (しかも高速で少ないメモリで) 行うことに興味がある場合は、私の会社の製品であるDotImageを見て、TiffDocumentクラスを見てください。この CodeProject の記事では、その方法を示しています

于 2009-12-14T16:01:56.427 に答える