保存时CxImage GIF“已损坏”

时间:2012-10-06 19:53:14

标签: c++ image gif

我在C ++ CxImage库中保存GIF时遇到了一些问题。 我也在CxImage论坛上发布了这个,但它们似乎已经死了,所以我希望在这里找到一个使用CxImage并且可能遇到过此问题的人。

我使用的是7.01版(最新版)。

当我保存GIF时,它总是显示为17x15像素,大多数软件都无法显示。 (Internet Explorer,Windows资源管理器,Photoshop 7.0,Irfanview)。其他软件处理此罚款(MSPaint,MSOffice照片编辑器和CxImage本身)。

我已深入挖掘,并且已经看到它是由xxgif.cpp中的第698行的CxImageGIF :: EncodeRGB引起的:

const int32_t cellw = 17; // <-- This is where the dimensions shown in Win Explorer come from
const int32_t cellh = 15; // <--
CxImageGIF tmp;
for (int32_t y=0;y<head.biHeight;y+=cellh){
    for (int32_t x=0;x<head.biWidth;x+=cellw){
        if ((head.biWidth -x)<cellw) w=head.biWidth -x; else w=cellw;
        if ((head.biHeight-y)<cellh) h=head.biHeight-y; else h=cellh;

        if (w!=tmp.GetWidth() || h!=tmp.GetHeight()) tmp.Create(w,h,8);

        if (IsTransparent()){
            tmp.SetTransIndex(0);
            tmp.SetPaletteColor(0,GetTransColor());
        }

        uint8_t i;
        for (uint32_t j=0;j<h;j++){
            for (uint32_t k=0;k<w;k++){
                i=(uint8_t)(1+k+cellw*j);
                tmp.SetPaletteColor(i,GetPixelColor(x+k,head.biHeight-y-h+j));
                tmp.SetPixelIndex(k,j,tmp.GetNearestIndex(tmp.GetPaletteColor(i)));
            }
        }

        tmp.SetOffset(x,y);
        tmp.EncodeExtension(fp);
        tmp.EncodeBody(fp,true);
    }
}

逻辑屏幕描述符设置为正确的图像大小,但显然,图像以小的15x17数据块进行编码。

根据我对GIF标准的理解,这可以通过这种方式完成,但似乎很多程序都没有正确理解这一点,并假设每个块都是整个框架。也许我错了,我昨晚刚刚阅读了关于GIF标准的部分

似乎这通常用于动画,CxImage将此帧的帧时间正确设置为0。但是,某些程序会使用默认的GIF超时逐块绘制图像。

我尝试修改代码,通过将cellw和cellh分别设置为head.biWidth和head.biHeight,使其在一个块中对每个帧进行编码,但无济于事。有没有人遇到过这个问题?

即使您不使用CxImage,但熟悉GIF89a,也许您可​​以确认我对GIF标准的解释是否正确? 我发现很难相信Microsoft和/或Adobe不会编写能够根据标准正确解码任何GIF图像的代码。 另外,我发现很难相信用于图像处理的最佳可用C ++库之一会不正确地或异常地编码像GIF这样的常见文件格式。

0 个答案:

没有答案