我需要从多页TIFF文件中删除页面。我目前正在使用.NET,但如果有人知道如何使用该语言,我可以使用其他语言。
页面可以是倒数第二页,也可以是文件中的最后一页。我需要解压缩文件中的前一页,因此不要创建新的TIFF并复制我仍然想要的所有页面。
我已经有了这样做的代码,但由于我正在使用的TIFF文件大约是1.0 gb - 3.0 gb压缩,这非常耗时。如果我可以删除我想要的文件部分,而不是创建一个更快的文件。
与文件的其余部分相比,我需要删除的页面非常小,就像可能会或可能不在其后的页面一样,大约500 * 500像素。
我尝试过,我尝试过LibTiff.Net库,在这里找到
http://bitmiracle.com/libtiff/
在搞砸了一段时间之后,我向开发人员询问了我的问题,他们说当前没有支持这样做。我也看了一下ImageMagick,但我也无法弄清楚如何做到这一点。
有人在这里有任何有用的想法吗?
答案 0 :(得分:3)
好的,有一个在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方法专门用于删除倒数第二页/目录并将最后一页移动,但理论上它应该适用于除最后一个目录之外的任何目录,并且可以很容易地修改它以删除最后一个目录。它至少需要你正在处理的文件大小的自由ram数量,但它运行速度快,文件大小不是大多数TIFF的问题。这不是最优雅的方法,如果有人有另一个请发帖。