Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解压TIF文件中的LZW图像数据-图像数据不';不要用清晰的代码开始_C#_Compression_Tiff_Lzw - Fatal编程技术网

C# 解压TIF文件中的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压缩

我正在编写一个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压缩数据中遇到代码,这些代码在字符串表中没有相应的条目,从而导致错误

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