我需要在C程序中检查gif图像。我查看了FreeImage库,但我无法弄明白。有人可以举例说明使用FreeImage来了解有关gif图像的所有细节,例如帧,背景,透明度等......以及如何增加帧并获取动画的当前图像/像素。我遇到的问题是你将图像加载到FIMULTIBITMAP类型,而大多数函数采用FIBITMAP类型。我没有看到你应该如何使用带有GIF的库。
另外,是否有更简单的库?
Ferruccio说使用libGD。这是我在这个库中找到的。
/* These read the first frame only */
BGD_DECLARE(gdImagePtr) gdImageCreateFromGif (FILE * fd);
我需要所有的框架。
下面是有点工作。问题是图像的宽度/高度变化小于实际图像。我认为它只是显示了改变了什么,但我不确定如何将其映射回原始图像以使用它。这是Gif File。
实际上这个库并没有像我认为的那样工作。例如,我无法获得图像的调色板。我得到的是全零。有什么建议吗?
#include <stdio.h>
#include <string.h>
#include <FreeImage.h>
int main(int argc, char *argv) {
FIMULTIBITMAP *src;
src = FreeImage_OpenMultiBitmap(FIF_GIF, "clock_logo_ani.gif", FALSE, TRUE, FALSE, GIF_DEFAULT);
int count = FreeImage_GetPageCount(src);
int page, i, row, col, background, transparent;
RGBQUAD bkcolor;
BYTE pixel;
char buffer[25*16 + 16];
RGBQUAD *palette;
background = 0;
for(page = 0; page < count; page++) {
FIBITMAP *dib = FreeImage_LockPage(src, page);
if(dib) {
printf("%dx%d\n", FreeImage_GetHeight(dib), FreeImage_GetWidth(dib));
FreeImage_GetBackgroundColor(dib, &bkcolor);
background = (&bkcolor)->rgbReserved;
transparent = FreeImage_GetTransparentIndex(dib);
memset(buffer, ' ', sizeof(char) * 24 * 16 + 17 * sizeof(char));
for( row = 0; row < 16; row++ ) {
for( col = 0; col < 24; col++ ) {
if ( FreeImage_GetPixelIndex(dib, col, row, &pixel) ) {
if((int)pixel != 0)
buffer[row * 25 + col] = '.';
}
}
}
for (row = 0; row < 16; row++)
buffer[row * 25 + 25] = '\n';
buffer[row * 25] = '\0';
printf("-----\n%s\n-----\n", buffer);
FreeImage_UnlockPage(src, dib, FALSE);
}
}
FreeImage_CloseMultiBitmap(src, GIF_DEFAULT);
}
这是输出。注意图像的大小是如何变化的。
16x24
-----
...
.. ..
. .
. .
. .
. .
. .
. ... .
. . .
. . .
. . .
. . .
. .
.. ..
...
-----
4x4
-----
.
.
.
-----
4x3
-----
...
-----
4x3
-----
.
.
.
-----
4x4
-----
.
-----
4x4
-----
.
.
-----
4x4
-----
...
-----
4x4
-----
.
.
.
-----
答案 0 :(得分:2)
在问题中包含的代码中,一旦锁定页面,您就可以执行以下操作:
bool isTransparent=FreeImage_IsTransparent(dib);
RGBQUAD* bkcolor;
bool didIGetBackgroundCorrectly=FreeImage_GetBackgroundColor(dib, bkcolor);
FreeImage_LockPage为您提供的指针是该帧的图像。您应该能够在采用FIBITMAP类型的任何其他函数中使用它。 (但请记住,在上面的代码中,您以只读方式打开它)
你已经知道动画中有多少帧,“count”就是这么说的。 (当然是零基础)这很简单。
答案 1 :(得分:0)
我对LibGD祝你好运。
答案 2 :(得分:0)
如果您愿意使用c ++,ImageMagick有绑定来执行此操作。它有一个c api,但我没有看到任何功能。