giflib을 사용해서 annimated gif 파일을 만드는 법을 알아보도록 하겠습니다.
giflib은 여기서 다운 받을수 있습니다.(http://sourceforge.net/projects/giflib/)
인터넷 상에서 gif file format은 검색해서 한번 보시는게 도움이 될것입니다.
예제 코드와 output입니다.
1/100 초단위로 frame이 바뀌고, 무한 반복하도록 했습니다.
giflib은 여기서 다운 받을수 있습니다.(http://sourceforge.net/projects/giflib/)
인터넷 상에서 gif file format은 검색해서 한번 보시는게 도움이 될것입니다.
예제 코드와 output입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | // giflib_test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <string.h> #include "..\..\lib\gif_lib.h" #define WIDTH 200 #define HEIGHT 200 GifFileType *GIFfile = NULL; ColorMapObject *GIFcmap = NULL; void initGIF() { int i; GIFcmap = MakeMapObject(256, NULL); GIFfile = EGifOpenFileName("oscilout.gif", 0); for (i = 0; i < 256; i++) { double r, g, b, f; f = (i - 1) / 254.0; if (i == 0) { r = g = b = 0; } else if (3 * f < 1) { r = 3 * f; g = 0; b = 1 - 3 * f; } else if (3 * f < 2) { r = 1; g = 3 * f - 1; b = 0; } else { r = 1; g = 1; b = 3 * f - 2; } GIFcmap->Colors[i].Red = r * 255; GIFcmap->Colors[i].Green = g * 255; GIFcmap->Colors[i].Blue = b * 255; } EGifPutScreenDesc(GIFfile, WIDTH, HEIGHT, 128, 0, GIFcmap); } void closeGIF() { printf("closeGIF\n"); EGifCloseFile(GIFfile); } int _tmain(int argc, _TCHAR* argv[]) { int nIndex = 0; unsigned char img[WIDTH*HEIGHT]; GraphicControlExtensionBlock GraphicControlExtBlock; initGIF(); /** * Writes Netscape application extension to define repeat count. */ EGifPutNetscapeAppExtensionBlock(GIFfile , 0); //! repeat infinitely //! set graphic control extension block unsigned char gce[4] = {0,}; gce[0] |= 1; gce[0] |= 2; gce[1] = 1 % 256; gce[2] = 1 / 256; gce[3] = 1; for(int j = 0;j < 256;j+=10) { EGifPutExtension(GIFfile , 0xf9 , sizeof(gce) , gce); EGifPutImageDesc(GIFfile, 0, 0, WIDTH, HEIGHT, 0, NULL); memset(img , j , sizeof(char)*WIDTH*HEIGHT); nIndex = 0; for(int i = 0;i < HEIGHT;++i) { for(int j = 0;j < WIDTH;++j) { int col = img[nIndex++]; EGifPutPixel(GIFfile , col); } } } FreeMapObject(GIFcmap); closeGIF(); return 0; } | cs |
댓글
댓글 쓰기