| [2] | 1 | #include "zlib.h" |
|---|
| 2 | #include <stdio.h> |
|---|
| 3 | #include <stdlib.h> |
|---|
| 4 | |
|---|
| 5 | int main(int argc, char *argv[]) |
|---|
| 6 | { |
|---|
| 7 | FILE *fp = fopen(argv[1], "rb"); |
|---|
| 8 | if (argc != 2 || fp==0) |
|---|
| 9 | { |
|---|
| 10 | fprintf(stderr, "%s [filename]\n", argv[0]); |
|---|
| 11 | return -1; // ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù. |
|---|
| 12 | } |
|---|
| 13 | // ÆÄÀÏ »çÀÌÁ ±¸ÇÑ´Ù. |
|---|
| 14 | fseek (fp , 0 , SEEK_END); |
|---|
| 15 | long lSize = ftell (fp); |
|---|
| 16 | rewind (fp); |
|---|
| 17 | // ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© Åë°·Î º¹»çÇÑ´Ù. |
|---|
| 18 | unsigned char *raw = (unsigned char*)malloc(lSize); |
|---|
| 19 | fread (raw, 1, lSize, fp); |
|---|
| 20 | fclose(fp); |
|---|
| 21 | // ¾ÐÃàµÇÁö ¾ÊÀº Ç¥ÁØ Æ÷¸ËÀ¸·Î º¯È¯ÇÑ´Ù. |
|---|
| 22 | unsigned int nWidth = raw[18] + raw[19]*256; |
|---|
| 23 | unsigned int nHeight = raw[22] + raw[23]*256; |
|---|
| 24 | unsigned int nBuffWidth = ((nWidth+3)/4)*4; // BMP ÆÄÀÏÀº 4¹ÙÀÌÆ® ´ÜÀ§·Î ÁÙ Á¤·ÄµÇ¾î ÀÖ´Ù. |
|---|
| 25 | int nMode = 0; |
|---|
| 26 | int nBuffSize = nWidth*nHeight+5; |
|---|
| 27 | unsigned char *buff = (unsigned char*)malloc(nBuffSize); |
|---|
| 28 | buff[0] = nMode; |
|---|
| 29 | buff[1] = raw[19]; |
|---|
| 30 | buff[2] = raw[18]; |
|---|
| 31 | buff[3] = raw[23]; |
|---|
| 32 | buff[4] = raw[22]; |
|---|
| 33 | unsigned char* tmp = &buff[5]; |
|---|
| 34 | int x = 0, y = 0; |
|---|
| 35 | for (y = nHeight-1; y >= 0; y--) |
|---|
| 36 | { |
|---|
| 37 | int nPos = raw[10] + raw[11]*256 + y*nBuffWidth; // µ¥ÀÌÅÍ ½ÃÀÛ À§Ä¡ |
|---|
| 38 | for (x = 0; x < nWidth; x++) |
|---|
| 39 | { |
|---|
| 40 | *tmp = raw[nPos]; |
|---|
| 41 | tmp++; |
|---|
| 42 | nPos++; |
|---|
| 43 | } |
|---|
| 44 | } |
|---|
| 45 | free(raw); |
|---|
| 46 | // ¾ÐÃàÀ» ÇØº»´Ù. |
|---|
| 47 | if (nBuffSize > 20*100000) |
|---|
| 48 | { |
|---|
| 49 | // ¾ÐÃà ¹öÆÛ Áغñ |
|---|
| 50 | long compressed_Size = nBuffSize*3; |
|---|
| 51 | raw = (unsigned char*)malloc(compressed_Size); |
|---|
| 52 | if (compress(raw, &compressed_Size, &buff[5], nWidth*nHeight) == 0) // ¾ÐÃ༺°ø |
|---|
| 53 | { |
|---|
| 54 | if (compressed_Size < nBuffSize-8) |
|---|
| 55 | { |
|---|
| 56 | nBuffSize = compressed_Size + 8; |
|---|
| 57 | buff[0] = nMode = 1; |
|---|
| 58 | buff[5] = compressed_Size / (256*256); // 0xFFFFFF ±îÁö¸¦ ¾ÐÃàµÈ À̹ÌÁöÀÇ ÃÖ´ëÅ©±â·Î ÇÑ´Ù. |
|---|
| 59 | buff[6] = compressed_Size / (256); |
|---|
| 60 | buff[7] = compressed_Size % (256); |
|---|
| 61 | memcpy(&buff[8], raw, compressed_Size); |
|---|
| 62 | } |
|---|
| 63 | } |
|---|
| 64 | free(raw); |
|---|
| 65 | } |
|---|
| 66 | |
|---|
| 67 | // ¹è¿ À̸§À» °áÁ¤ÇÑ´Ù. |
|---|
| 68 | int nNameStart = 0; |
|---|
| 69 | int i = 0; |
|---|
| 70 | int nStrLen = (int)strlen(argv[1]); |
|---|
| 71 | for (i = 0 ; i < nStrLen; i++) |
|---|
| 72 | { |
|---|
| 73 | if (argv[1][i] == '/') nNameStart =i+1; |
|---|
| 74 | if (argv[1][i] == '.') argv[1][i] = 0; |
|---|
| 75 | } |
|---|
| 76 | printf("const unsigned char %s[%d] = {", &argv[1][nNameStart], nBuffSize); |
|---|
| 77 | // À̹ÌÁö ¹è¿À» Àû´Â´Ù. |
|---|
| 78 | for (i = 0; i < nBuffSize; i++) |
|---|
| 79 | { |
|---|
| 80 | if (i%8 == 0) printf("\n\t"); |
|---|
| 81 | printf("0x%02X, ",buff[i]); |
|---|
| 82 | } |
|---|
| 83 | printf("\n};\n"); |
|---|
| 84 | // À̹ÌÁö ¹è¿ ´Ý±â |
|---|
| 85 | free(buff); |
|---|
| 86 | return 0; |
|---|
| 87 | } |
|---|