您的位置:首页 > 编程语言

24位和8位BMP图片保存纯C代码

2013-11-15 13:58 507 查看
BMP图片大家都知道,可以通过查看BMP图片结构使用纯C就可以打开,编辑,处理,保存图片。非常方便使用。

具体BMP结构可以参考:wingdi.h头文件。今天主要在进行删减代码,需要把多余的代码删除,之前写的保存bmp代码就此贴在这里留着以后需要的时候使用:

8位BMP图片保存代码:

BOOL SaveMatrixToGrayBmp(char* sBMPFile, //name of BMP file
BYTE *pMatrix, // pointer to Matrix Bits array
int bmpWidth ,
int bmpHeight // width and height of the bmp
)
{
FILE* fp;
int bytesofScanLine,i,j;

DWORD dwFileSize;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
BYTE tempb=0;

fp = fopen(sBMPFile, "wb");
bytesofScanLine=(bmpWidth % 4==0) ? bmpWidth: ((bmpWidth+3)/4*4);
dwFileSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+bytesofScanLine*bmpHeight;

bmfHeader.bfType=((WORD) ('M' << 8) | 'B');
bmfHeader.bfSize=dwFileSize;
bmfHeader.bfReserved1=0;
bmfHeader.bfReserved2=0;
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;

fwrite(&bmfHeader,sizeof(bmfHeader), 1, fp);

// fill the bmp file Infomation Header.
bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth=bmpWidth;
bmiHeader.biHeight=bmpHeight;
bmiHeader.biPlanes=1;
bmiHeader.biBitCount=8;
bmiHeader.biCompression=BI_RGB;
bmiHeader.biSizeImage=0;
bmiHeader.biXPelsPerMeter=0;
bmiHeader.biYPelsPerMeter=0;
bmiHeader.biClrUsed=256;
bmiHeader.biClrImportant=256;

fwrite(&bmiHeader,sizeof(bmiHeader), 1, fp);

// fill the color tables.
for (i=0; i<256 ; i++)
{
bmiColors[i].rgbBlue=(BYTE)(i);
bmiColors[i].rgbGreen=(BYTE)(i);
bmiColors[i].rgbRed=(BYTE)(i);
bmiColors[i].rgbReserved=0;
}

fwrite(&(bmiColors[0]),sizeof(RGBQUAD)*256, 1, fp);

// fill the BMP data to file
for (j=bmpHeight-1 ; j>=0 ; j--)
{
fwrite((pMatrix+(j*bmpWidth)), 1, bmpWidth, fp);
for (i=0; i<(bytesofScanLine-bmpWidth) ; i++)
fwrite(&tempb, 1, 1, fp);
}

fclose(fp);
return true;
}


24位BMP图片保存代码:

BOOL  SaveRGBMatrixToColorBmp(char* sBMPFile, //name of BMP file
BYTE  *pRGBMat, // pointer to DIB bits array
int bmpWidth  ,//width of the bmp
int bmpHeight //  height of the bmp
)
{
// create the empty 24bit color BMP file
FILE* fp;
fp = fopen(sBMPFile, "wb");
DWORD dwFileSize;
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader;

int bytesofScanLine,i,j;
bytesofScanLine=((bmpWidth*3) % 4==0) ? (bmpWidth*3): (4*int(bmpWidth*3/4)+4) ;
dwFileSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
+bytesofScanLine*fabs((double)bmpHeight);

// fill the bmp file Header;
bmfHeader.bfType=((WORD) ('M' << 8) | 'B');
bmfHeader.bfSize=dwFileSize;
bmfHeader.bfReserved1=0;
bmfHeader.bfReserved2=0;
bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)
fwrite(&bmfHeader,sizeof(bmfHeader), 1, fp);

// fill the bmp file Infomation Header.
bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmiHeader.biWidth=bmpWidth;
bmiHeader.biHeight= fabs((double)bmpHeight);
bmiHeader.biPlanes=1;
bmiHeader.biBitCount=24;
bmiHeader.biCompression=BI_RGB;
bmiHeader.biSizeImage=0;
bmiHeader.biXPelsPerMeter=0;
bmiHeader.biYPelsPerMeter=0;
bmiHeader.biClrUsed=0;
bmiHeader.biClrImportant=0;
fwrite(&bmiHeader,sizeof(bmiHeader), 1, fp);

// fill the BMP data to file
BYTE  dummy = 0;
BYTE tempb=0;
for  (j=fabs((double)bmpHeight)-1; j>=0 ; j--)
{
fwrite((pRGBMat+j*3*bmpWidth), bmpWidth*3, 1, fp);
if (bmpWidth*3 != bytesofScanLine)
{
for  (i = 0; i<bytesofScanLine - bmpWidth*3; i++)
fwrite(&dummy, 1, 1, fp);
}

}
fclose(fp);
return true;
}


使用例子:

SaveMatrixToGrayBmp("./mid/Gray.bmp", Gray, iWidth, iHeight)

SaveRGBMatrixToColorBmp("./mid/Img.bmp", Img, iWidth, iHeight)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: