2

マルチページのTIFFファイルからページを削除する必要があります。私は現在.NETで作業していますが、誰かがその言語でそれを行う方法を知っていれば、別の言語に移動できます。

ページは、最後から2番目、またはファイルの最後のページのいずれかになります。また、ファイル内の前のページを解凍せずにそれを行う必要があるため、新しいTIFFを作成したり、必要なすべてのページをコピーしたりする必要はありません。

私はすでにそれを行うコードを持っていますが、私が扱っているTIFFファイルは約1.0 gb〜3.0 gbであり、非常に圧縮されているため、これには非常に時間がかかります。ファイルの必要な部分を削除するだけで、はるかに高速な新しいファイルを作成できない場合。

削除する必要のあるページは、ファイルの残りの部分と比較して非常に小さく、その後にある場合とない場合があるページは、約500*500ピクセルです。

私が試したことは、ここにあるLibTiff.Netライブラリを試したことです。

http://bitmiracle.com/libtiff/

しばらくそれをいじった後、私は開発者に私の問題について尋ねました、彼らは現在それをするためのサポートがないと言いました。ImageMagickも少し調べましたが、そこでもこれを行う方法がわかりませんでした。

誰かがここで役立つアイデアを手に入れましたか?

4

1 に答える 1

3

OK、Pythonで動作するソリューションを入手しました。

import mmap
from struct import *

def main():
    filename = raw_input("Input file name: ")
    f = open(filename, "r+b")
    offList, compList = getOffsets(f)
    for i in range(len(offList)):
        print "offset: ", offList[i], "\t Compression: ", compList[i]
    print "ran right"
    stripLabelAndMacro(f, offList, 3)
    offList, compList = getOffsets(f)
    for i in range(len(offList)):
        print "offset: ", offList[i], "\t Compression: ", compList[i]
    f.close()
    #test stripping end crap

def getOffsets(f):
    fmap = mmap.mmap(f.fileno(),0)
    offsets = []
    compressions = []
    #get TIFF version
    ver = int(unpack('H', fmap[2:4])[0])
    if ver == 42:
        #get first IDF
        offset = long(unpack('L', fmap[4:8])[0])
        while (offset != 0):
            offsets.append(offset)
            #get number of tags in this IDF
            tags = int(unpack('H', fmap[offset:offset+2])[0])
            i = 0
            while (i<tags):
                tagID = int(unpack('H',fmap[offset+2:offset+4])[0])
                #if the tag is a compression, get the compression SHORT value and
                #if recognized use a string representation
                if tagID == 259:
                    tagValue = int(unpack('H', fmap[offset+10:offset+12])[0])
                    if tagValue == 1:
                        compressions.append("None")
                    elif tagValue == 5:
                        compressions.append("LZW")
                    elif tagValue == 6:
                        compressions.append("JPEG")
                    elif tagValue == 7:
                        compressions.append("JPEG")
                    elif tagValue == 34712 or tagValue == 33003 or tagValue == 33005:
                        compressions.append("JP2K")
                    else:
                        compressions.append("Unknown")
                i+=1
                offset += 12

            offset = long(unpack('L', fmap[offset+2:offset+6])[0])
    return offsets, compressions

#Tested, Doesn't break TIFF
def stripLabel(f, offsetList, labelIndex):
    fmap = mmap.mmap(f.fileno(),0)
    offsetLabel = offsetList[labelIndex]
    offsetMacro = offsetList[labelIndex+1]
    offsetEnd = fmap.size()
    macroSize = offsetEnd - offsetMacro
    for i in range(macroSize):
        fmap[offsetLabel+i] = fmap[offsetMacro+i]
    fmap.flush()
    fmap.resize(offsetLabel+macroSize-1)
    fmap.close()

それをテストしました、うまくいくようです。stripLabelメソッドは、特に最後から2番目のページ/ディレクトリを削除し、最後のページを上にシフトすることを目的としていますが、理論的には最後以外のディレクトリでも機能するはずであり、最後から削除するように簡単に変更できます。作業中のファイルサイズとして少なくとも空きRAMの量が必要ですが、実行速度が速く、ほとんどのTIFFではファイルサイズは問題になりません。これは最もエレガントなアプローチではありません。誰かが別のアプローチを持っている場合は、投稿してください。

于 2011-03-10T15:06:22.450 に答える