質問
Cプログラムでgifイメージを調べる必要があります。 FreeImageライブラリを調べましたが、理解できません。誰かがFreeImageを使用して、フレーム、背景、透明度などのGIF画像に関するすべての詳細を取得する例を教えてください。そして、フレームをインクリメントしてアニメーションの現在の画像/ピクセルを取得する方法。私が抱えている問題は、ほとんどの関数がFIBITMAP型を取るのに対して、イメージをFIMULTIBITMAP型にロードすることです。ライブラリをgifで使用する方法がわかりません。
また、よりシンプルなライブラリはありますか?
FerruccioはlibGDを使用すると述べました。このライブラリで見つけたものは次のとおりです。
/* These read the first frame only */
BGD_DECLARE(gdImagePtr) gdImageCreateFromGif (FILE * fd);
すべてのフレームが必要です。
以下は一種の働きです。問題は、画像の幅/高さの変化が実際の画像よりも小さくなることです。何が変わったのかを示しているだけだと思いますが、それを元の画像にマッピングして使用する方法がわかりません。 Gifファイルは次のとおりです。
実際には、このライブラリは機能すると思われるように機能していません。たとえば、画像のパレットを取得できません。私が得るものはすべてゼロです。それに関する提案はありますか?
#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
-----
.
.
.
-----
解決
質問に含まれるコードでは、ページをロックすると、次のことができます。
bool isTransparent=FreeImage_IsTransparent(dib);
RGBQUAD* bkcolor;
bool didIGetBackgroundCorrectly=FreeImage_GetBackgroundColor(dib, bkcolor);
FreeImage_LockPageが提供するポインターは、そのフレームの画像です。 FIBITMAP型を取る他の関数のいずれかで使用できるはずです。 (ただし、上記のコードでは、読み取り専用で開いたことを思い出してください)
アニメーションに含まれるフレームの数はすでにわかっています。「カウント」あなたにそれを与えます。 (もちろんゼロベース)それは非常に簡単です。
他のヒント
LibGD で幸運に恵まれました。
c ++を使用する場合、 ImageMagick にはこれを行うためのバインディングがあります。 C APIがありますが、それを行う関数はありません。