我在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这样的常见文件格式。