游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2899|回复: 7

如果没有MASK图怎么做透明图啊?

[复制链接]

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2006-3-13 23:38:00 | 显示全部楼层 |阅读模式
如果没有旁边的MASK图我想让图片边上的黑色为透明该怎么做?能给段C++代码吗? 还有做这种处理用JPG的图和BMP的图有什么区别吗?我是菜鸟,才开始学做游戏,以前学DELPHI的C++正在努力学习中。
sf_2006313233743.jpg

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2006-3-14 01:22:00 | 显示全部楼层

Re:如果没有MASK图怎么做透明图啊?

if (*pixel!=colorkey)
*dst=*pixel;
dst++;

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2006-3-14 07:51:00 | 显示全部楼层

Re:如果没有MASK图怎么做透明图啊?

如果要用colorkey最好别用jpg,因为JPG是有损压缩的,会对原图进行处理,可能在本来是透明的地方(主要是边缘)出现一些斑点

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2006-3-14 12:46:00 | 显示全部楼层

Re:如果没有MASK图怎么做透明图啊?

说的对!用colorkey的话最好用:BMP,GIF,TGA,PNG。

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2006-3-14 16:34:00 | 显示全部楼层

Re:如果没有MASK图怎么做透明图啊?

哦。谢谢!我这就试试看。

4

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2006-3-14 16:56:00 | 显示全部楼层

Re:如果没有MASK图怎么做透明图啊?

if (*pixel!=colorkey)
*dst=*pixel;
dst++;
=========
说实话我没看懂!

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2006-3-14 19:25:00 | 显示全部楼层

Re: Re:如果没有MASK图怎么做透明图啊?

ghostbbk: Re:如果没有MASK图怎么做透明图啊?

if (*pixel!=colorkey)
*dst=*pixel;
dst++;
=========
说实话我没看懂!


是COLORKEY就不拷贝撒!

8

主题

30

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2006-3-15 09:10:00 | 显示全部楼层

Re:如果没有MASK图怎么做透明图啊?

我提供一个gdi下的透明方法:
void TransparentBlt(HDC hdcDest,      // 目标DC
                                        int nXOriginDest,   // 目标X偏移
                                        int nYOriginDest,   // 目标Y偏移
                                        int nWidthDest,     // 目标宽度
                                        int nHeightDest,    // 目标高度
                                        HDC hdcSrc,         // 源DC
                                        int nXOriginSrc,    // 源X起点
                                        int nYOriginSrc,    // 源Y起点
                                        int nWidthSrc,      // 源宽度
                                        int nHeightSrc,     // 源高度
                                        UINT crTransparent  // 透明色,COLORREF类型
                                        )
{
        HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);        // 创建兼容位图
        HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);                        // 创建单色掩码位图
        HDC                hImageDC = CreateCompatibleDC(hdcDest);
        HDC                hMaskDC = CreateCompatibleDC(hdcDest);
        hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
        hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

        // 将源DC中的位图拷贝到临时DC中
        if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
                ::BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
        else
                StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
                                        hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

        // 设置透明色
        SetBkColor(hImageDC, crTransparent);

        // 生成透明区域为白色,其它区域为黑色的掩码位图
        ::BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

        // 生成透明区域为黑色,其它区域保持不变的位图
        SetBkColor(hImageDC, RGB(0, 0, 0));
        SetTextColor(hImageDC, RGB(255, 255, 255));
        ::BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

        // 透明部分保持屏幕不变,其它部分变成黑色
        SetBkColor(hdcDest,RGB(255, 255, 255));
        SetTextColor(hdcDest,RGB(0, 0, 0));
        ::BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

        // "或"运算,生成最终效果
        ::BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

        // 清理、恢复       
        SelectObject(hImageDC, hOldImageBMP);
        DeleteDC(hImageDC);
        SelectObject(hMaskDC, hOldMaskBMP);
        DeleteDC(hMaskDC);
        DeleteObject(hImageBMP);
        DeleteObject(hMaskBMP);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 22:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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