我需要檢查C程序中的gif圖像。我看着FreeImage庫,但我無法弄清楚。有人可以舉一個使用FreeImage的例子,以瞭解有關gif圖像的所有小細節,例如幀,背景,透明度等......以及如何通過幀增加並獲取動畫的當前圖像/像素。我遇到的問題是將圖像加載到FIMULTIBITMAP類型中,而大多數函數採用FIBITMAP類型。我沒有看到你應該如何使用GIF圖書館。圖像庫和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
-----
.
.
.
-----
你知道爲什麼這些幀可以是不同於實際圖像的大小嗎?我用一些新代碼更新了這個問題。 – Scott 2009-06-21 22:20:38