C# 解压TIF文件中的LZW图像数据-图像数据不';不要用清晰的代码开始
我正在编写一个C#库来解释和显示TIF文件中的图像,其中图像数据条使用LZW压缩进行压缩。我正在用另一个应用程序生成的一组21个TIF文件进行测试,我无法控制这些文件 我在某个地方读到,图像数据应该以清晰的代码开头,但它不在Adobe TIFF6规范中,我现在找不到它的源代码 在14个测试文件中,图像数据以256的LZW清除代码值开始(图像数据中的第一个字节为0x8000,因此1000 0000的前9位为1 0000=256十进制)。我可以解压,并显示这些没有问题 然而,在7个文件中,LZW压缩数据的前两个字节是0x06FA、0x0712或0x097A。显然,这些代码不是触发我初始化LZW字符串表的清晰代码。即使LZW字符串表是用初始256值初始化的,我也会很快在LZW压缩数据中遇到代码,这些代码在字符串表中没有相应的条目,从而导致错误C# 解压TIF文件中的LZW图像数据-图像数据不';不要用清晰的代码开始,c#,compression,tiff,lzw,C#,Compression,Tiff,Lzw,我正在编写一个C#库来解释和显示TIF文件中的图像,其中图像数据条使用LZW压缩进行压缩。我正在用另一个应用程序生成的一组21个TIF文件进行测试,我无法控制这些文件 我在某个地方读到,图像数据应该以清晰的代码开头,但它不在Adobe TIFF6规范中,我现在找不到它的源代码 在14个测试文件中,图像数据以256的LZW清除代码值开始(图像数据中的第一个字节为0x8000,因此1000 0000的前9位为1 0000=256十进制)。我可以解压,并显示这些没有问题 然而,在7个文件中,LZW压缩
0x06FA = 0000 0110 1111 1010 first 9 bits = 0 0000 1101 = 0x0D = 13 decimal
0x0712 = 0000 0111 0001 0010 first 9 bits = 0 0000 1110 = 0x0E = 14 decimal
0x097A = 0000 1001 0111 1010 first 9 bits = 0 0001 0010 = 0x12 = 18 decimal
这些值是否有我尚未发现的特殊意义?是否应将它们视为字符串表中的常规代码?如果是这样,为什么我随后会遇到字符串表中还没有条目的代码?或者我遇到问题的7个文件是否不符合规范?它们在IrfanView中显示良好,因此我认为它们确实符合要求
这是我的解压代码,我尽可能地将其保存在TIFF6规范中的算法中
public byte[] DecompressToBytes()
{
List<byte> decompressed = new List<byte>();
int oldCode = 0;
int code = 0;
string entry;
// Just in case the first code we encounter isn't the clearcode.
initializeDictionary();
// getNextCode decides whether to read a 9, 10, 11 or 12 bit value
// based on size of string table Dictionary.
while(((code = getNextCode()) != EndOfInformation)) // EndOfInformation = 257
{
if(code == ClearCode) // ClearCode = 256
{
initializeDictionary();
code = getNextCode();
if(code == EndOfInformation)
break;
entry = Dictionary[code];
// convert string (eg "0A0B0C") to bytes and add to output.
addBytes(decompressed, entry);
oldCode = code;
}
else
{
if(Dictionary.ContainsKey(code))
{
entry = Dictionary[code];
addBytes(decompressed, entry);
Dictionary.Add(Dictionary.Count, stringFromCode(oldCode) + stringFromCode(code).Substring(0, 2));
oldCode = code;
}
else
{
entry = stringFromCode(oldCode) + stringFromCode(oldCode).Substring(0, 2);
addBytes(decompressed, entry);
Dictionary.Add(Dictionary.Count, entry);
oldCode = code;
}
}
}
return decompressed.ToArray();
}
public byte[]解压缩字节()
{
已解压缩列表=新建列表();
int oldCode=0;
int代码=0;
字符串输入;
//以防我们遇到的第一个代码不是clearcode。
初始化指令();
//getNextCode决定是否读取9、10、11或12位值
//基于字符串表字典的大小。
而(((code=getNextCode())!=EndOfInformation))//EndOfInformation=257
{
if(code==ClearCode)//ClearCode=256
{
初始化指令();
代码=getNextCode();
if(代码==内部信息)
打破
条目=字典[代码];
//将字符串(如“0A0B0C”)转换为字节并添加到输出。
addBytes(解压缩,条目);
oldCode=代码;
}
其他的
{
if(字典.容器(代码))
{
条目=字典[代码];
addBytes(解压缩,条目);
Dictionary.Add(Dictionary.Count,stringFromCode(oldCode)+stringFromCode(code).Substring(0,2));
oldCode=代码;
}
其他的
{
entry=stringFromCode(oldCode)+stringFromCode(oldCode)。子字符串(0,2);
addBytes(解压缩,条目);
Dictionary.Add(Dictionary.Count,entry);
oldCode=代码;
}
}
}
返回已解压缩的.ToArray();
}
为了结束这篇文章,我误解了规范。导致我出现问题的文件中有多条图像数据。我认为图像数据的开始实际上是单个条带偏移的开始 为了结束这篇文章,我误解了规范。导致我出现问题的文件中有多条图像数据。我认为图像数据的开始实际上是单个条带偏移的开始 这可能是图像描述符中多页块的开始吗?看看其他人是怎么做的:@CeeMcSharpface你可能发现了什么。我可以成功显示的文件都具有RowsPerStrip==ImageLength,即整个图像位于单个条带中。我遇到问题的是RowsPerStrip