做图像处理时,有时需要临时生成图使用。以下是生成320x240 24位图的一个简单的代码实现:
#define widthbytes(bits) ((dword)(((bits) 31) & (~31)) / 8)
void makebmp()
{
int nsize =abs(long(240 * widthbytes(24 * 320)));
char* buff = new char[nsize];
memset(buff, 0, nsize);
bitmapinfoheader header;
header.bisize = sizeof(bitmapinfoheader);
header.biwidth = 320;
header.biheight = 240*(-1);
header.bibitcount = 24;
header.bicompression = 0;
header.bisizeimage = 0;
header.biclrimportant = 0;
header.biclrused = 0;
header.bixpelspermeter = 0;
header.biypelspermeter = 0;
header.biplanes = 1;
//3 构造文件
bitmapfileheader bmpfileheader;
handle hfile = null;
dword dwtotalwriten = 0;
dword dwwriten;
bmpfileheader.bftype = 0x4d42; //'bm';
bmpfileheader.bfoffbits=sizeof(bitmapfileheader) sizeof(bitmapinfoheader);
bmpfileheader.bfsize = sizeof(bitmapfileheader) sizeof(bitmapinfoheader) nsize;
file* pf = fopen("d:\\test.bmp", "wb");
fwrite(&bmpfileheader, sizeof(bitmapfileheader), 1, pf);
fwrite(&header, sizeof(bitmapinfoheader), 1, pf);
fwrite(buff, 1, nsize, pf);
fclose(pf);
delete buff;
}
唯一需要解释的就是这句:
#define widthbytes(bits) ((dword)(((bits) 31) & (~31)) / 8)
这是为了保证32字节对齐。vc的头文件和directshow的文件都能找到定义。
因为 memset(buff, 0, nsize);
所以生成的图是黑色的。
可以自己修改,按rgb三字节写上不同的值,看看图像有什么变化。
阅读(3308) | 评论(0) | 转发(0) |