Библиотеки изображений и изображения GIF

StackOverflow https://stackoverflow.com/questions/1024009

  •  06-07-2019
  •  | 
  •  

Вопрос

Мне нужно изучить изображение 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, но я не вижу никаких функций для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top