我看网上的位图文件读写操作代码中经常有这一行
BITMAP bm;
.......
::GetObject(hBitmap,sizeof(bm),(LPSTR)&bm); //为什么要这样进行类型转化
它为什么要将bm类型指针转化为LPSTR类型
还有这个也是
::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);// 获取该调色板下新的像素值
BITMAP bm;
.......
::GetObject(hBitmap,sizeof(bm),(LPSTR)&bm); //为什么要这样进行类型转化
它为什么要将bm类型指针转化为LPSTR类型
还有这个也是
::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);// 获取该调色板下新的像素值
个人觉得这里的::GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);写成BYTE*可能会好一些
GetDIBits(hDC, hBitmap, 0, (UINT) bm.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB_RGB_COLORS);
如果你不强制转换的话,这个很可以会崩溃想想(char*)lpbi + NUMBER和lpbi + NUMBER是不一样的(加入NUMBER为一个常数,lpbi为其它类型的指针)
(char*)lpbi + NUMBER等于(char*)lpbi + NUMBER * sizeof(char)
lpbi + NUMBER 等于 lpbi + NUMBER * sizeof(lpbi的类型)
那这个的强制转化又是什么作用呢
::GetObject(hBitmap,sizeof(bm),(LPSTR)&bm);
意思是这里强制转换可能和GetDIBits函数内部使用该指针的方式有关比如GetDIBits对应形参为p
函数体里面执行了p++操作对于不同类型的指针p++的结果不一样p是int *的话 p++意味着指针移动4个字节p是char *的话 p++意味着移动1个字节像素值是0-255之间的一个数 通常1字节表示
它为什么要将bm类型指针转化为LPSTR类型
=============
这个API的原型第三个参数要求的是LPVOID,也就是一个以字节为单位的缓冲区,因为LPSTR这个指针也是指向认字节为单位的,所以可以。
(char*)lpbi+sizeof(BITMAPINFOHEADER) 意思是移动到该指针值+sizeof(BITMAPINFOHEADER)个字节的指针位置处吗,那为什么要放到这后面,不是要填充BITMAPINFO吗