现在开始学习有关数字图像处理部分,首先接触的是BMP图像。
刚开始以为很多有关图像格式的定义需要自己来完成,后来才知道,这些已经被包含在内库中了,感觉比较方便。
首先介绍一下BMP图像的文件格式:
位图文件头->文图信息头->彩色表->位图数据。
以下源代码是《数字图像处理实训教程》中有关raw数据到bmp格式的转换,是八位的bmp图像。
#include <stdio.h>
#include <Windows.h>
int main()
{
//打开lena.raw文件
FILE* fp=fopen("d://lena.raw","rb");
if (fp==NULL)
{
printf("can not open file lena.raw");
return 0;
}
unsigned char* image[1000];
//申请512字节的内存空间,把起始地址赋给image[i]
for (int i=0;i<512;++i)
{
image[i]=new unsigned char[512];
fread(image[i],1,512,fp);
}
fclose(fp);
//**************************************************
//这里可以加入有关图像处理的函数(尝试用cuda实现)
//**************************************************
FILE *fp1=fopen("d://new.bmp","wb");
if (fp1==NULL)
{
printf("can not open new.bmp/n");
return 0;
}
int imageW=512;
int imageH=512;
int storeW=imageW;
//每一行的字节数必需是4的整数倍,就是与DWORD对其,所有填充imageW
if (storeW%4!=0)
{
storeW+=(4-storeW%4);
}
BITMAPFILEHEADER bh;
bh.bfType=((WORD)('M'<<8)|'B');
bh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+storeW*imageH;
bh.bfReserved1=0;
bh.bfReserved2=0;
bh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
BITMAPINFOHEADER bInfo;
bInfo.biSize=sizeof(BITMAPINFOHEADER);
bInfo.biWidth=imageW;
bInfo.biHeight=imageH;
bInfo.biPlanes=1;
bInfo.biBitCount=8;
bInfo.biCompression=BI_RGB;
bInfo.biSizeImage=storeW*imageH;
bInfo.biXPelsPerMeter=0;
bInfo.biYPelsPerMeter=0;
bInfo.biClrUsed=256;
bInfo.biClrImportant=0;
fwrite(&bh,sizeof(BITMAPFILEHEADER),1,fp1);
fwrite(&bInfo,sizeof(BITMAPINFOHEADER),1,fp1);
RGBQUAD rgb;
rgb.rgbReserved=0;
for (int i=0;i<256;++i)
{
rgb.rgbBlue=rgb.rgbGreen=rgb.rgbRed=i;
fwrite(&rgb,sizeof(RGBQUAD),1,fp1);
}
for (int i=0;i<512;++i)
{
fwrite(image[511-i],1,512,fp1);
}
fclose(fp1);
}
感觉代码有点小问题,虽然能够运行成功,但是分配的很多内存都没有释放。