|
|

楼主 |
发表于 2008-9-16 01:49:00
|
显示全部楼层
Re:求 Win32改变图片透明度程序代码
case WM_PAINT:
{
LPCSTR array[2] = {"C.BMP", "D.BMP"}; //C为背景 D为前景
hdc = BeginPaint(hWnd, &ps);
::GetClientRect(hWnd, &rect);
// TODO: 在此添加任意绘图代码...
Oldhdc = CreateCompatibleDC(hdc);
bitmap[0] = (HBITMAP): oadImage(NULL, array[0], IMAGE_BITMAP, 600, 400, LR_LOADFROMFILE);
//::SelectObject(Oldhdc, bitmap[0]);
//BitBlt(hdc, 0, 0, 600, 400, Oldhdc, 0, 0, SRCCOPY);
bitmap[1] = (HBITMAP)::LoadImage(NULL, array[1], IMAGE_BITMAP, 400, 300, LR_LOADFROMFILE);
//::SelectObject(Oldhdc, bitmap[1]);
//BitBlt(hdc, 50, 50, 400, 300, Oldhdc, 0, 0, SRCCOPY);
::GetObject(bitmap[0], sizeof(bmpBG), &bmpBG); //获得背景图片信息 存入bmpBG中
BYTE *a1 = new BYTE[bmpBG.bmHeight * bmpBG.bmWidthBytes];
::GetBitmapBits(bitmap[0], bmpBG.bmHeight * bmpBG.bmWidthBytes, a1);
::GetObject(bitmap[1], sizeof(bmpFor), &bmpFor); //获得前景图片信息
BYTE *a2 = new BYTE[bmpFor.bmHeight * bmpFor.bmWidthBytes];
::GetBitmapBits(bitmap[1], bmpFor.bmHeight * bmpFor.bmWidthBytes, a2);
int rgb_b, x, y, i;
int PixelBytes = bmpFor.bmBitsPixel/8; //int为8位
for (y=0; y<bmpFor.bmHeight; y++) //改变前景RGB 50%
{
for (x=0; x<bmpFor.bmWidth; x++)
{
rgb_b = y * bmpFor.bmWidthBytes + x * PixelBytes;
//将 B 色彩值乘以 50%
a2[rgb_b + 0] = (BYTE)(a2[rgb_b + 0]*0.5);
//将 G 色彩值乘以 50%
a2[rgb_b + 1] = (BYTE)(a2[rgb_b + 1]*0.5);
//将 R 色彩值乘以 50%
a2[rgb_b + 2] = (BYTE)(a2[rgb_b + 2]*0.5);
}
}
for (y=0; y<bmpFor.bmHeight; y++) //其实是修改背景色。最后显示修改
{
for (x=0; x<bmpFor.bmWidth; x++) //的背景图,看起来前景为半透明
{
rgb_b = x * PixelBytes + y * bmpBG.bmWidthBytes;
i = y * bmpFor.bmWidthBytes + x * PixelBytes;
//将B 色彩值乘以50% 并与bmpBG相加
a1[rgb_b + 0] = (BYTE)(a1[rgb_b + 0]*0.5 + a2);
//将G 色彩值乘以50% 并与bmpBG相加
a1[rgb_b + 1] = (BYTE)(a1[rgb_b + 1]*0.5 + a2[i + 1]);
//将R 色彩值乘以50% 并与bmpBG相加
a1[rgb_b + 2] = (BYTE)(a1[rgb_b + 2]*0.5 + a2[i + 2]);
}
}
::SetBitmapBits(bitmap[0], bmpBG.bmHeight * bmpBG.bmWidthBytes, a1);
::SelectObject(Oldhdc, bitmap[0]); //显示修改象素颜色后的背景图
BitBlt(hdc, 0, 0, 600, 400, Oldhdc, 0, 0, SRCCOPY);
DeleteObject(Oldhdc);
DeleteObject(bitmap[0]);
DeleteObject(bitmap[1]);
delete a1;
delete a2;
EndPaint(hWnd, &ps);
}
很久以前写在paint里面的了 呵呵你可以把他提出来封成一个函数哈 win32的 |
|