游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2173|回复: 3

求 Win32改变图片透明度程序代码

[复制链接]

2

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2008-7-22 20:07:00 | 显示全部楼层 |阅读模式
把一张图片弄半透明

在另一张上显示..意思就是可以同时看见两张图

我只有MFC的代码 没有 Win32的.有的朋友谢谢分享

2

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 2008-7-22 20:09:00 | 显示全部楼层

Re:求 Win32改变图片透明度程序代码

就写核心的就行 我自己琢磨 谢谢大哥大姐们了

35

主题

141

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2008-9-5 10:58:00 | 显示全部楼层

Re:求 Win32改变图片透明度程序代码

通过图片的R G B的颜色来改变灰度

2

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
 楼主| 发表于 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的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 07:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表