문제

C 프로그램에서 GIF 이미지를 검사해야합니다. 나는 FreeImage 라이브러리를 살펴 보았지만 그것을 알아낼 수 없습니다. 프레임, 배경, 투명성 등과 같은 GIF 이미지에 대한 모든 작은 세부 사항을 사용하여 프레임을 통해 증가하고 애니메이션의 현재 이미지/픽셀을 얻는 방법에 대한 모든 작은 세부 사항을 얻을 수있는 예를 제공 할 수 있습니까? 내가 가진 문제는 이미지를 fimultibitmap 유형에로드하고 대부분의 함수는 fibitmap 유형을 취한다는 것입니다. 나는 당신이 GIF와 함께 라이브러리를 어떻게 사용 해야하는지 보지 못합니다.

또한 더 간단한 라이브러리가 있습니까?

페루치오는 Libgd를 사용한다고 말했다. 이 라이브러리에서 찾은 내용은 다음과 같습니다.

/* These read the first frame only */
BGD_DECLARE(gdImagePtr) gdImageCreateFromGif (FILE * fd);

모든 프레임이 필요합니다.

아래는 일종의 작동입니다. 문제는 이미지의 너비/높이 변경이 실제 이미지보다 작다는 것입니다. 나는 그것이 바뀌는 것을 보여주고 있다고 생각하지만, 그것을 원래 이미지에 다시 맵핑하여 그것을 사용하는 방법을 잘 모르겠습니다. 여기에 있습니다 GIF 파일.

실제로이 도서관은 작동한다고 가정하는 것처럼 작동하지 않습니다. 예를 들어 이미지의 팔레트를 얻을 수 없습니다. 내가 얻는 것은 모두 0입니다. 그것에 대한 제안이 있습니까?

#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 유형을 취하는 다른 기능 중 하나에서 사용할 수 있어야합니다. (그러나 위의 코드에서 읽기 전용을 열었다는 것을 기억하십시오)

당신은 이미 애니메이션에 몇 개의 프레임이 있는지 알고 있습니다. "Count"가 당신에게 제공합니다. (물론 제로 기반) 매우 간단합니다.

다른 팁

나는 행운을 빕니다 libgd.

C ++를 기꺼이 사용하려는 경우 Imagemagick 이를 위해 구속력이 있습니다. AC API가 있지만 그렇게 할 기능은 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top