Библиотеки изображений и изображения GIF
Вопрос
Мне нужно изучить изображение GIF в программе на Си. Я заглянул в библиотеку FreeImage, но не могу понять. Может ли кто-нибудь привести пример использования FreeImage, чтобы получить все мелкие сведения о gif-изображении, такие как кадры, фон, прозрачность и т. Д. И как увеличить размер кадров и получить текущее изображение / пиксели анимации. У меня проблема в том, что вы загружаете изображение в тип FIMULTIBITMAP, в то время как большинство функций принимают тип FIBITMAP. Я не понимаю, как вы должны использовать библиотеку с GIF-файлами.
Кроме того, есть ли более простая библиотека?
Ферруччо сказал использовать 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, но я не вижу никаких функций для этого.