C 在gif帧之间应用补丁

C 在gif帧之间应用补丁,c,diff,gif,giflib,C,Diff,Gif,Giflib,我想提取gif帧到原始BGRA数据,我用来解析格式。我有第一帧,我想它像视频中的一个关键帧,看起来不错,第二帧实际上是15帧,但让我们简化一下,它看起来像diff帧。以下是样本: 使用diff数据恢复第二个完整帧似乎很简单,但问题是:我不知道不更改颜色索引意味着什么。diff帧上的黑色像素实际上是黑色的–其在颜色贴图中的索引是255,即rgb0,0,0。我打印了整个颜色表,没有发现任何其他黑色条目。如果有兴趣的话。背景色指数是193,所以也没有意义 所以,我无法区分黑色和无颜色。如果第二帧真

我想提取gif帧到原始BGRA数据,我用来解析格式。我有第一帧,我想它像视频中的一个关键帧,看起来不错,第二帧实际上是15帧,但让我们简化一下,它看起来像diff帧。以下是样本:

使用diff数据恢复第二个完整帧似乎很简单,但问题是:我不知道不更改颜色索引意味着什么。diff帧上的黑色像素实际上是黑色的–其在颜色贴图中的索引是255,即rgb0,0,0。我打印了整个颜色表,没有发现任何其他黑色条目。如果有兴趣的话。背景色指数是193,所以也没有意义

所以,我无法区分黑色和无颜色。如果第二帧真的包含一些新的黑色像素,因为左眼在动画中移动,会怎么样?但程序应该以不同的方式处理它:对于无颜色,获取前一帧颜色;对于黑色,获取rgb0,0,0

UPD:这是我的代码。子帧处理和内存清理是必需的。在这里,我假设颜色表中没有最后一个颜色索引。它实际上适用于我的测试文件,但我不确定它是否能正常工作

    DGifSlurp(image);
    int* master = malloc(image->SWidth * image->SHeight * sizeof(int));
    for (int i = 0; i < image->ImageCount; i++) {
        SavedImage* frame = &image->SavedImages[i];

        ColorMapObject* cmap = frame->ImageDesc.ColorMap ? frame->ImageDesc.ColorMap : image->SColorMap;

        int nocoloridx = cmap->ColorCount - 1;

        IplImage* mat = cvCreateImage(cvSize(frame->ImageDesc.Width, frame->ImageDesc.Height), IPL_DEPTH_8U, 4);
        mat->imageData = malloc(frame->ImageDesc.Width * frame->ImageDesc.Height * 4);

        for (int y = 0; y < frame->ImageDesc.Height; y++)
        for (int x = 0; x < frame->ImageDesc.Width; x++) {
            int offset = y * frame->ImageDesc.Width + x;
            int coloridx = frame->RasterBits[offset];
            if (coloridx == nocoloridx) {
                coloridx = master[offset];
            } else {
                master[offset] = coloridx;
            }
            GifColorType color = cmap->Colors[coloridx];
            cvSetComponent(mat, x, y, 0, color.Blue);
            cvSetComponent(mat, x, y, 1, color.Green);
            cvSetComponent(mat, x, y, 2, color.Red);
            cvSetComponent(mat, x, y, 3, 100);
        }

        cvNamedWindow("t", CV_WINDOW_AUTOSIZE);
        cvShowImage("t", mat);
        cvWaitKey(0);
    }

你看过吗?应该给你透明颜色的索引,如果有的话。我使用了通过自制安装的giflib,它是第四个分支,而扩展阅读器在第五个版本中实现,如果doc是正确的。你确定我要找的是透明的颜色索引吗?文件可能根本不包含透明度,但仍然可以包含带有差异压缩的动画。@Hasturkun看起来你是对的。例如,是带有透明度标志==0且未指定透明颜色的动画gif的标题。我用giflib解析了它,其中的每一帧似乎都是完整的关键帧——不仅是静止的像素,还有地球右侧的动画。唯一的问题是在giflib 4中获得透明密钥,但它与这个问题无关。请随意发布答案,我会将其标记为正确。我错了,这不仅仅是关于透明度。我也看到了。您需要结合处理方法,从frame->ImageDesc->Top和Left可以获得的帧偏移量,也有您需要的宽度和高度,以及透明度。我没有尝试过这些,我只是在阅读文档,这就是为什么我不会将此作为答案发布的原因。我不能测试atmI读过的任何东西,我知道top/left,我实现了它,但使用了粘贴的代码。但我完全错过了处理方法的部分。我将giflib升级到5.0.5,并将进一步挖掘。谢谢你的帮助。