C++的图像半透明真的这么难吗?

seti3d 2012-01-01 03:30:33

bool Graph::HandleBuffer(int tx,int ty)
{
DDSURFACEDESC2 ddsd, ddsd2;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ZeroMemory(&ddsd2, sizeof(ddsd2));
ddsd2.dwSize = sizeof(ddsd2);

lpOBuf[1]->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
lpOBuf[3]->Lock(NULL,&ddsd2,DDLOCK_WAIT,NULL);

DWORD surface_width = ddsd.dwWidth;
DWORD surface_height = ddsd.dwHeight;
BYTE *Bitmap = (BYTE*)ddsd.lpSurface;
BYTE *p = Bitmap;
LONG l_pitch = ddsd.lPitch;
DWORD byteCounts=ddsd.ddpfPixelFormat.dwRGBBitCount/8;

int y,x;
for (y=0;y<surface_height;y++)
{
p = Bitmap+byteCounts*surface_width+y*l_pitch;
for (x=0;x<surface_width;x++)
{
*(p)*=0.6f;
*(p+1)*=0.6f;
*(p+2)*=0.6f;
}
}

BYTE *Bitmap2 = (BYTE*)ddsd2.lpSurface;
BYTE* p2=Bitmap2;
LONG l_pitch2 = ddsd2.lPitch;
DWORD byteCounts2=ddsd2.ddpfPixelFormat.dwRGBBitCount/8;
DWORD surface_width2 = ddsd2.dwWidth;
DWORD surface_height2 = ddsd2.dwHeight;
int i=0;
for (y=ty;y<ty+surface_height;y++)
{
p = Bitmap+byteCounts*surface_width+i*l_pitch;
p2 = Bitmap2+byteCounts2*surface_width2+y*l_pitch2;
for (x=tx;x<tx+surface_width;x++)
{
*(p2)*=0.4f;
*(p2)+=*p;
*(p2+1)*=0.4f;
*(p2+1)+=*(p+1);
*(p2+2)*=0.4f;
*(p2+2)+=*(p+2);
p2+=4;
p+=4;

}
i++;
}
lpOBuf[3]->Unlock(NULL);
lpOBuf[1]->Unlock(NULL);

RECT bgs;
SetRect(&bgs,0,0,384,288);
draw->BltToBBuffer(0,0,lpOBuf[3],bgs,false);
}


两张图片分别在两个不同的离屏页面里lpOBuf[3]和lpOBuf[1],我想制作他们半透明。
以上是过程函数。
虽然能显示出来图像,但出来的效果就是不透明。不知道为什么?

搞这个搞了17天,每天20个小时在研究这个,现在还没弄出来,难道真的这么难吗?

请高手长鞭伺候!
...全文
325 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
seti3d 2012-01-02
  • 打赏
  • 举报
回复
8楼说的,是全局透明。
9楼说的似乎有点靠谱。
但是说的太简单,不太明白。
看了你那个链接里的,公式我也知道。
要不,我不会写楼上那些代码了,现在问题是总不透明。
按原理来说早应该透明了。
zhao1zhong6 2012-01-02
  • 打赏
  • 举报
回复
代码可以不要这么啰嗦先这样试试50%:
//先同步指针
*(p2) = (*(p2) + *p)/2;
zhao1zhong6 2012-01-02
  • 打赏
  • 举报
回复
//这里指针可是没有移动啊
for (x=0;x<surface_width;x++)
{
*(p)*=0.6f;
*(p+1)*=0.6f;
*(p+2)*=0.6f;
}
横云断岭 2012-01-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 seti3d 的回复:]

8楼说的,是全局透明。
9楼说的似乎有点靠谱。
但是说的太简单,不太明白。
看了你那个链接里的,公式我也知道。
要不,我不会写楼上那些代码了,现在问题是总不透明。
按原理来说早应该透明了。
[/Quote]
可以尝试把图片保存到文件中,用不同的浏览器,或者软件来打开。
也许早就是实现了透时,而那个显示不对。
或者下个真正的半透明的图,贴到你的软件上,就知道是不是显示有问题。
如此美丽的你 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 startstartsvip 的回复:]
引用 6 楼 seti3d 的回复:


用directdraw


难怪看不出来,没搞过,听说有两种方法:

1)Color keying


// Set white to be the transparent color

DDCOLORKEY ColorKey;
ColorKey.dwColorSpaceLowValue = RGB(255,255,255);……
[/Quote]
+
灼眼的超哥 2012-01-01
  • 打赏
  • 举报
回复
图片的透明,你需要一个背景图来衬托出这个图片有透明效果,要么设置背景图为马赛克,把带透明效果的图片贴到马赛克背景图上,前提是有alpha通道,RGB是颜色,alpha是透明度,混合公式可以参考这个:http://topic.csdn.net/u/20110623/14/ac5fbbff-a3f9-469f-a362-ecde8aa32a3f.html
startstartsvip 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 seti3d 的回复:]


用directdraw
[/Quote]

难怪看不出来,没搞过,听说有两种方法:

1)Color keying


// Set white to be the transparent color

DDCOLORKEY ColorKey;
ColorKey.dwColorSpaceLowValue = RGB(255,255,255);
ColorKey.dwColorSpaceHighValue = RGB(255,255,255);

surfaceMyBitmap->SetColorKey(DDCKEY_SRCBLT,&DDColorKey);

// Now we can blt the transparent surface to another surface

RECT rect;
SetRect(&rect,0,0,nBitmapWidth,nBitmapHieght);
surfacePrimary->Blt( &rect,surfaceMyBitmap, &rect, DDBLT_KEYSRC, NULL );


2)Alpha channels,不详
游戏设计师 2012-01-01
  • 打赏
  • 举报
回复
- -~
既然用dircedraw设置关键色色不就可以了
要是要自己检测的话,两个离屏页面中先载入一个,然后检测关键色替换为另一个离屏页面的就可以了~
seti3d 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 startstartsvip 的回复:]
搞了17天,每天20个小时

围观楼主,啊, 不好意思,眼神不好

楼主在用 GDI 还是 GDI+ 呢?
[/Quote]
用directdraw
startstartsvip 2012-01-01
  • 打赏
  • 举报
回复
搞了17天,每天20个小时

围观楼主,啊, 不好意思,眼神不好

楼主在用 GDI 还是 GDI+ 呢?
seti3d 2012-01-01
  • 打赏
  • 举报
回复
2楼的图杯具了。
seti3d 2012-01-01
  • 打赏
  • 举报
回复
因为我想透过绿色图即:lpOBuf[1],看到房子的一角lpOBuf[3]。
即给绿色图lpOBuf[1]做透明效果。
seti3d 2012-01-01
  • 打赏
  • 举报
回复


这是我那个过程函数,运行后出来的效果。
BugRunner 2012-01-01
  • 打赏
  • 举报
回复
木有设置alpha通道的值吧
01一个~2 02 软件启动画面 03 不规则窗口的实现 04 多色窗口的实现 05 创建图标 06 以图片为背景的标题栏 07 工具窗口 08 切分窗口 09 显示多姿多彩的动画图标 10 智能滚动条 100 特效画线 11 在工具栏上绘制双把手 12 制作可扩展对话框 13 不规则形状按钮 14 窗口显示为显示背景图 15 奇妙的三维文字按钮 16 彩色按钮的实现 17 计算器 18 使用DIB制作动画按钮 19 Winamp样式的自动停靠对话框 20 在对话框中预览位图 21 文字的特殊显示效果 22 动画字体 23 旋转文本 24 渐隐渐显地显示图像 25 马赛克的实现 26 动画启动界面 27 透明的图像 28 用OpenGL实现简单动画 29 屏幕放大镜 30 绘制光源照射的球体 31 图像的缩放 32 半透明的三维物体 33 OpenGL中雾的应用 34 制作CD播放器 35 播放WAV文件 36 制作AVI动画按钮 37 用MFC制作屏幕保护程序 38 在OpenGL视图中绘制三维物体 39 透明的按钮 40 打开真彩色位图 41 彩色立方体 42 简易的Windows媒体播放器 43 制作MIDI播放器 44 场景反走样效果 45 制作景深效果 46 进行拷屏打印 47 纹理映射 48 多线程的实现 49 改变系统时间 50 滚动字幕的实现 51 获取和修改计算机名 52 获取文件属性 53 获取系统文件夹的路径 54 检测硬件设备 55 组合框的自动查询技术 56 实时捕捉光标位置 57 内存监测器 58 确定正在运行的进程 59 文件变更通知 60 重新启动和关闭计算机 61 字体选择组合框 62 设置显示器分辨率 63 Vc++中IO的应用 64 以二进制形式查看文件 65 串行化功能的实现 66 独特的读写工具 67 打开PCX格式文件 68 IP编辑器 69 服务器端应用程序 70 客户端应用程序 71 网络浏览器 72 映射网络驱动器 73 HTTP监控器 74 基于IE4组件的浏览器 75 基于STMP的邮件发送系统 76 监控POP3上的电子邮件收发 77 信箱应用程序接口的使用 78 超级链接的制作 79 数据库对话框 80 ISAPI身份鉴定过滤器 81 用电子表格显示数据库内容 82 动态创建数据源 83 在动态集中使用虚拟列表 84 使用数据访问对象的MSDI 85 气球式提示栏 86 具有不可选项的组合框 87 扩展静态文本控件 88 列表控件 89 树形控件 90 制作一个多功能的状态栏 91 组合框控件的多列显示 92 ATL&MFC构造COM自动化编程界面 93 ActiveX文档容器 94 创建向导程序 95 模式对话框 96 非模式对话框 97 颜色对话框的使用 98 四则运算的实现 99 多功能的画笔

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧