首页 > 解决方案 > 如何使用 gif_lib 将 RGB 编码为 gif

问题描述

如果我像这样运行 RGB2GIF:

RGB2GIF(true, 1, "../tests/porsche.rgb", ExpNumOfColors, 320, 200); 

输出就像原始图像

原图

但是当我使用另一个 rgb 文件时:

RGB2GIF(true, 1, "D:\\rgb.yuv", ExpNumOfColors, 1280, 720);` 

out gif 文件缺少颜色。

糟糕的 gif 捕获图像

它与全局颜色图有关吗?本地色图?

static void SaveGif(GifByteType *OutputBuffer, int Width, int Height, int ExpColorMapSize, ColorMapObject *OutputColorMap){int i, Error;
GifFileType *GifFile;
GifByteType *Ptr = OutputBuffer;

/* Open stdout for the output file: */
gfile = fopen("D:\\out_my.gif", "wb+");
if ((GifFile = EGifOpen(gfile, writeGifData, &Error)) == NULL) {
    PrintGifError(Error);
    exit(EXIT_FAILURE);
}

if (EGifPutScreenDesc(GifFile,
    Width, Height, ExpColorMapSize, 0,
    OutputColorMap) == GIF_ERROR ||
    EGifPutImageDesc(GifFile,
    0, 0, Width, Height, false, OutputColorMap) ==
    GIF_ERROR){
    PrintGifError(Error);
    printf("error\n");
    exit(EXIT_FAILURE);
}


GifQprintf("\n%s: Image 1 at (%d, %d) [%dx%d]:     ",
    PROGRAM_NAME, GifFile->Image.Left, GifFile->Image.Top,
    GifFile->Image.Width, GifFile->Image.Height);

for (i = 0; i < Height; i++) {
    if (EGifPutLine(GifFile, Ptr, Width) == GIF_ERROR)
        exit(EXIT_FAILURE);
    GifQprintf("\b\b\b\b%-4d", Height - i - 1);

    Ptr += Width;
}
printf("\n");
printf("close file\n");
if (EGifCloseFile(GifFile, &Error) == GIF_ERROR)
    PrintGifError(Error);
fclose(gfile);
exit(EXIT_FAILURE);
}

static void RGB2GIF(bool OneFileFlag, int NumFiles, char *FileName, int 
ExpNumOfColors, int Width, int Height)
{
    int ColorMapSize;
    GifByteType *RedBuffer = NULL, *GreenBuffer = NULL, *BlueBuffer = NULL, 
    *OutputBuffer = NULL;
    ColorMapObject *OutputColorMap = NULL;
    ColorMapSize = 1 << ExpNumOfColors;

if (NumFiles == 1) {
    LoadRGB(FileName, OneFileFlag,
        &RedBuffer, &GreenBuffer, &BlueBuffer, Width, Height);
}
else {
    LoadRGB(NULL, OneFileFlag,
        &RedBuffer, &GreenBuffer, &BlueBuffer, Width, Height);
}

if ((OutputColorMap = GifMakeMapObject(ColorMapSize, NULL)) == NULL ||
    (OutputBuffer = (GifByteType *)malloc(Width * Height *
    sizeof(GifByteType))) == NULL)
    GIF_EXIT("Failed to allocate memory required, aborted.");
printf("GifQuantizeBuffer\n");
if (GifQuantizeBuffer(Width, Height, &ColorMapSize,
    RedBuffer, GreenBuffer, BlueBuffer,
    OutputBuffer, OutputColorMap->Colors) == GIF_ERROR)
    exit(EXIT_FAILURE);
free((char *)RedBuffer);
free((char *)GreenBuffer);
free((char *)BlueBuffer);

SaveGif(OutputBuffer, Width, Height, ExpNumOfColors, OutputColorMap);
}

标签: gifencode

解决方案


没有人使用这个 lib 编码 gif?除了 gif.h 之外,还有其他一些库可以对 gif 进行编码吗?


推荐阅读