gpt4 book ai didi

c++ - GIF LZW解压

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:36 25 4
gpt4 key购买 nike

我正在尝试用 C++ 实现一个简单的 Gif-Reader。

我目前坚持解压缩图像数据。如果图像包含 Clear Code,我的解压缩算法将失败。

Clear Code 后,我重建了 CodeTableCodeSize 重置为 MinimumLzwCodeSize + 1。
然后我阅读下一段代码并将其添加到索引流中。问题是清除后,下一个代码包含的值大于当前代码表的大小。
例如来自维基百科的示例文件:rotating-earth.gif代码值为 262,但 GlobalColorTable 仅为 256。

我该如何处理?
我按照gif spec.实现了lzw解压.

这里是解压的主要代码部分:

int prevCode = GetCode(ptr, offset, codeSize);
codeStream.push_back(prevCode);

while (true)
{
auto code = GetCode(ptr, offset, codeSize);

//
//Clear code
//
if (code == IndexClearCode)
{
//reset codesize
codeSize = blockA.LZWMinimumCodeSize + 1;
currentNodeValue = pow(2, codeSize) - 1;

//reset codeTable
codeTable.resize(colorTable.size() + 2);

//read next code
prevCode = GetCode(ptr, offset, codeSize);
codeStream.push_back(prevCode);

continue;
}
else if (code == IndexEndOfInformationCode)
break;


//exists in dictionary
if (codeTable.size() > code)
{
if (prevCode >= codeTable.size())
{
prevCode = code;
continue;
}

for (auto c : codeTable[code])
codeStream.push_back(c);

newEntry = codeTable[prevCode];
newEntry.push_back(codeTable[code][0]);

codeTable.push_back(newEntry);

prevCode = code;

if (codeTable.size() - 1 == currentNodeValue)
{
codeSize++;
currentNodeValue = pow(2, codeSize) - 1;
}
}
else
{
if (prevCode >= codeTable.size())
{
prevCode = code;
continue;
}

newEntry = codeTable[prevCode];
newEntry.push_back(codeTable[prevCode][0]);

for (auto c : newEntry)
codeStream.push_back(c);

codeTable.push_back(newEntry);

prevCode = codeTable.size() - 1;

if (codeTable.size() - 1 == currentNodeValue)
{
codeSize++;
currentNodeValue = pow(2, codeSize) - 1;
}
}
}

最佳答案

找到解决方案。它被称为延迟清除代码
因此,当我检查 codeSize 是否需要递增时,我还需要检查 codeSize 是否已经达到 max(12),因为有可能获得最大代码大小的代码。
参见spec-gif89a.txt .

if (codeTable.size() - 1 == currentNodeValue && codeSize < 12)
{
codeSize++;
currentNodeValue = (1 << codeSize) - 1;
}

关于c++ - GIF LZW解压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26894809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com