Winapi CreateDIBSection+;16位系统颜色
此代码在32位系统颜色(Windows 7)上运行非常完美, 但它不适用于16位彩色-菜单位图不透明!!!:Winapi CreateDIBSection+;16位系统颜色,winapi,Winapi,此代码在32位系统颜色(Windows 7)上运行非常完美, 但它不适用于16位彩色-菜单位图不透明!!!: ... HBITMAP rv = rgb(hsrc, 16); ... HBITMAP rgb(HBITMAP hsrc, WORD wBitsPixel) { HBITMAP hold = NULL; HDC hdcsrc = NULL, hdc = NULL; BITMAP bmp = {0}; HBITMAP dib = NULL; UC
...
HBITMAP rv = rgb(hsrc, 16);
...
HBITMAP rgb(HBITMAP hsrc, WORD wBitsPixel) {
HBITMAP hold = NULL;
HDC hdcsrc = NULL, hdc = NULL;
BITMAP bmp = {0};
HBITMAP dib = NULL;
UCHAR *dst = NULL, *src = NULL, *tmp = NULL;
UCHAR alpha;
int bpl;
ULONG x, y;
DWORD bmp_size = 0;
HANDLE hdib = NULL;
char *lpbitmap = NULL;
int rv = 0;
hdc = GetDC(m_hMainDlg);
hdcsrc = CreateCompatibleDC(hdc);
hold = (HBITMAP)SelectObject(hdcsrc, hsrc);
rv = GetObject(hsrc, sizeof(BITMAP), &bmp);
BITMAPINFOHEADER bi = {0};
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bmp.bmWidth;;
bi.biHeight = bmp.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitsPixel;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
bmp_size = ((bmp.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmp.bmHeight;
hdib = GlobalAlloc(GHND, bmp_size);
lpbitmap = (char *)GlobalLock(hdib);
/* Get bits of source bitmap. */
GetDIBits(hdcsrc, hsrc, 0, bmp.bmHeight, lpbitmap, (BITMAPINFO *)&bi, DIB_RGB_COLORS);
/* For destination bitmap */
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(BITMAPINFO);
bmi.bmiHeader.biWidth = bmp.bmWidth;
bmi.bmiHeader.biHeight = bmp.bmHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = wBitsPixel;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
dib = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&dst, NULL, 0);
bpl = 4 * bmp.bmWidth; /* bytes per line */
src = (UCHAR *)lpbitmap;
for (y = 0; y < bmp.bmHeight; y++, src += bpl) {
tmp = src;
for (x = 0; x < bmp.bmWidth; x++) {
alpha = tmp[3];
dst[0] = tmp[0] * alpha / 255;
dst[1] = tmp[1] * alpha / 255;
dst[2] = tmp[2] * alpha / 255;
dst[3] = alpha;
dst += 4;
tmp += 4;
}
}
// free resources
ReleaseDC(m_hMainDlg, hdc);
SelectObject(hdcsrc, hold);
DeleteDC(hdcsrc);
GlobalUnlock(hdib);
GlobalFree(hdib);
return dib;
}
。。。
HBITMAP rv=rgb(hsrc,16);
...
HBITMAP rgb(HBITMAP hsrc,字wBitsPixel){
HBITMAP hold=NULL;
HDC HDC=NULL,HDC=NULL;
位图bmp={0};
HBITMAP dib=NULL;
UCHAR*dst=NULL,*src=NULL,*tmp=NULL;
乌查尔阿尔法;
int-bpl;
ULONG x,y;
DWORD bmp_大小=0;
句柄hdib=NULL;
char*lpbitmap=NULL;
int-rv=0;
hdc=GetDC(m_hMainDlg);
hdcsrc=CreateCompatibleDC(hdc);
按住=(HBITMAP)选择对象(HDCSC、hsrc);
rv=GetObject(hsrc、sizeof(位图)和bmp);
BitMapInfo标头bi={0};
bi.biSize=sizeof(BitMapInfo头);
bi.biWidth=bmp.bmWidth;;
bi.biHeight=bmp.bmHeight;
双平面=1;
bi.BIBITTCOUNT=WBITSPYLEX;
bi.biCompression=bi_RGB;
bi.biSizeImage=0;
bi.biXPelsPerMeter=0;
bi.biYPelsPerMeter=0;
bi.BICLRUSE=0;
bi.biclr=0;
bmp_大小=((bmp.bmWidth*bi.bibibitcount+31)/32)*4*bmp.bmHeight;
hdib=全局ALLOC(GHND,bmp_尺寸);
lpbitmap=(char*)GlobalLock(hdib);
/*获取源位图的位*/
GetDIBits(hdcsrc、hsrc、0、bmp.bmHeight、lpbitmap、(BITMAPINFO*)和bi、DIB_RGB_颜色);
/*用于目标位图*/
BITMAPINFO bmi={0};
bmi.bmiHeader.biSize=sizeof(BITMAPINFO);
bmi.bmiHeader.biWidth=bmp.bmWidth;
bmi.bmiHeader.biHeight=bmp.bmHeight;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=wBitsPixel;
bmi.bmiHeader.biCompression=BI_RGB;
bmi.bmiHeader.biSizeImage=0;
bmi.bmiHeader.biXPelsPerMeter=0;
bmi.bmiHeader.biYPelsPerMeter=0;
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;
dib=CreateDIBSection(空,和bmi,dib_RGB_颜色,(空**)和dst,空,0);
bpl=4*bmp.bmWidth;/*字节/行*/
src=(UCHAR*)lpbitmap;
对于(y=0;y
嗯,16bpp位图没有alpha通道。您创建了一个16bpp位图,但将其视为一个32bpp位图,这不起作用(而且是缓冲区溢出)。我需要16位颜色的透明位图,我能做什么?使用32bpp位图。您可以在16位设备上显示32bpp位图。它们只是失去了一些颜色分辨率。能给我一些代码吗?或者一些例子?你已经写了上面的代码。只需使用wBitsPixel=32。