由于我需要做个显示二值化摄像头图像的上位机程序,因此用到了VC++中的位图,下面是这样使用的:
static BITMAP bitmap={0,24,8,4,1,1}; //定义位图,这个BITMAP是一个位图的数据结构
typedef struct tagBITMAP
{
LONG bmType; //类型,因为只传二值化图像,所以这里初始化1
LONG bmWidth; //宽度,这里定义24
LONG bmHeight; //高度,这里定义8
LONG bmWidthBytes; //这个地方纠结了很久,它其实是一个计算方法,我们可以看到下面定义的bit中每一行有4个元素,因此定义为4,这个参数必须是2的倍数
WORD bmPlanes; //颜色面数
WORD bmBitsPixel; //图色位数,二值图就是1
LPVOID bmBits;
} BITMAP
static BYTE bit[]={ 0xFF,0,0,0, //这里就是需要载入的位图信息,用16进制表示,前面定义参数24说明一行只取24个点,一个16进制byte表示8个点,所以一行前3个有效
0x0C,0,0,0, //因为第4个参数必须是2的倍数,所以每行后面必须要再补一个0,数值8说明有8行
0x0C,0,0,0,
0x0C,0,0,0,
0xFF,0,0,0,
0xC0,0,0,0,
0xC0,0,0,0,
0xC0,0,0,0};
static HBITMAP hBitmap; //定义位图句柄
HDC hdcMem; //定义一个DC句柄作为缓冲区
case WM_CREATE:://在这个消息中加入如下
bitmap.bmBits=bit; //其实每次需要更新图像都可以用这个
hBitmap=CreateBitmapIndirect(&bitmap); //把位图信息标识得到句柄
case WM_PAINT://在这个消息中加入如下
hdcMem=CreateCompatibleDC(hdc); //创建临时缓冲DC,与hdc兼容
SelectObject(hdcMem,hBitmap); //选择位图画刷,相当于把位图当绘图工具
下面部分就是绘图,这里介绍几个函数:
BitBlt(hdc,0,0,100,100,hdcMem,0,0,SRCCOPY); //将hdcMem里的从(0,0)开始的图传递给hdc中从(0,0)到(100,100)的地方
StretchBlt(hdc,0,0,100,100,hdcMem,0,0,24,8,SRCCOPY); //将hdcMem里的从(0,0)开始,宽度24高度8的那一块拉伸使之匹配hdc中(0,0)到(100,100)的区域
DeleteDC(hdcMem); //清楚缓存