我只需要使用TIFF文件,打开它并在使用G4压缩时复制到新文件。
所以,我采用了LibTiff.Net和TiffCP实用程序。尽我所能从TIffCP转换代码,这是我的功能:
public static byte[] ConvertToG4Tiff(byte[] input)
{
var c = new Copier();
// Set compression to g4
if (!c.ProcessCompressOptions("g4")) return null;
// Open output tiff
var memoryStream = new MemoryStream();
var tiffStream = new TiffStream();
using (var outImage = Tiff.ClientOpen(string.Empty, "w", memoryStream, tiffStream))
{
using (var inImage = Tiff.ClientOpen(string.Empty, "read", new MemoryStream(input), new TiffStream()))
{
if (inImage == null) return null;
int totalPages = inImage.NumberOfDirectories();
for (var i = 0; i < totalPages;)
{
c.m_config = PlanarConfig.UNKNOWN;
c.m_compression = c.m_defcompression;
c.m_predictor = c.m_defpredictor;
c.m_fillorder = 0;
c.m_rowsperstrip = 0;
c.m_tilewidth = -1;
c.m_tilelength = -1;
c.m_g3opts = c.m_defg3opts;
if (!inImage.SetDirectory((short)i)) return null;
if (!c.Copy(inImage, outImage) || !outImage.WriteDirectory()) return null;
i++;
}
}
var retVal = new byte[tiffStream.Size(memoryStream)];
tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
return retVal;
}
}
我认为最后3行是我搞砸的地方。我得到有效的字节数组(有数据,它大约是原始未压缩TIFF的10%)
当我尝试再次使用代码打开它时 - 它将无法打开。通过这个相同的函数传递这个新数组是行不通的。打开的对象为NULL。
我做错了什么?
答案 0 :(得分:1)
您应该使用memoryStream
来检索压缩数据。请勿在此类代码中使用tiffStream
。
所以,
var retVal = new byte[tiffStream.Size(memoryStream)];
tiffStream.Read(memoryStream, retVal, 0, retVal.Length);
return retVal;
应该改为
var retVal = memoryStream.ToArray();
return retVal;
另请注意,您的代码不会转换数据,因此如果输入字节不是1bpp光栅,则代码将失败。
目前还不清楚为什么要将压缩数据传递给相同的代码。