가끔씩 그래픽 데이터를 파일로 저장할 필요가 있는데,
기존의 알려진 Graphic Library를 사용할려니 약간 부담이 될때
간단히 사용할수 있도록 256 색상의 BMP 파일로 저장하는 루틴입니다.
기존의 알려진 Graphic Library를 사용할려니 약간 부담이 될때
간단히 사용할수 있도록 256 색상의 BMP 파일로 저장하는 루틴입니다.
typedef unsigned char pix_type;
typedef struct {
int x;
int y;
int width; /* Horizontal width of image in pixels */
int height; /* Vertical height of image in pixels (also number of rows) */
unsigned long bufsize,indexsize;
pix_type *data; /* Image data, 1 byte per pixel, in large row-major block */
pix_type **image; /* Array of pointers to beginning of each data row */
}image_type;
typedef struct
{
char rgbBlue; /* 파란색 성분 */
char rgbGreen;
char rgbRed;
char rgbReserved;
}rgb_quad;
int write_bmp_file(char *fname,image_type *pimg,rgb_quad* palette)
{
assert(palette && "palette is NULL");
if(palette)
{
bmp_file_header bmfHeader;
bmp_info_header bmiHeader;
rgb_quad bmpRGB;
FILE *fp;
if((fp = fopen(fname,"wb")) != NULL)
{
bmfHeader.bfType = 0x4D42;
bmfHeader.bfSize = 0;
bmfHeader.bfReserved1 = 0;
bmfHeader.bfReserved2 = 0;
bmfHeader.bfOffBits = 1078;
bmiHeader.biSize = 40;
bmiHeader.biWidth = (pimg->width);
bmiHeader.biHeight= pimg->height;
bmiHeader.biPlanes= 1;
bmiHeader.biBitCount = 8;
bmiHeader.biCompression = 0;
bmiHeader.biSizeImage = (bmiHeader.biWidth * bmiHeader.biHeight)*(bmiHeader.biBitCount / 8);
bmiHeader.biXPelsPerMeter = 0;
bmiHeader.biYPelsPerMeter = 0;
bmiHeader.biClrUsed = 0;
bmiHeader.biClrImportant = 0;
bmfHeader.bfSize = bmiHeader.biSizeImage + 1078;
fwrite(&(bmfHeader.bfType) , 1 , sizeof(bmfHeader.bfType) , fp);
fwrite(&(bmfHeader.bfSize) , 1 , sizeof(bmfHeader.bfSize) , fp);
fwrite(&(bmfHeader.bfReserved1) , 1 , sizeof(bmfHeader.bfReserved1) , fp);
fwrite(&(bmfHeader.bfReserved2) , 1 , sizeof(bmfHeader.bfReserved2) , fp);
fwrite(&(bmfHeader.bfOffBits) , 1 , sizeof(bmfHeader.bfOffBits) , fp);
fwrite(&bmiHeader , 1 , sizeof(bmiHeader) , fp);
const int nCount = (bmfHeader.bfOffBits - 54) / sizeof(rgb_quad);
for(int i = 0;i < nCount;++i)
{
fwrite(palette + i , 1 , sizeof(rgb_quad) , fp);
}
int pdblCounter = 0;
for(int j = bmiHeader.biHeight - 1;j >= 0;--j)
{
for(int i = 0;i < bmiHeader.biWidth;++i)
{
fwrite(&(pimg->data[j * bmiHeader.biWidth + i]) , sizeof(pix_type) , 1 , fp);
}
if(0 != (bmiHeader.biWidth % 4))
{
for(int k = 0;k < (4 - (bmiHeader.biWidth % 4));++k)
{
char bytColor = 0;
fwrite(&bytColor , sizeof(pix_type) , 1 , fp);
}
}
}
fclose(fp);
return ERROR_SUCCESS;
}else return -1;
}
return 0;
}
댓글
댓글 쓰기