菜鸟求救,mobile 上快速显示带有渐变色的png图像

fruifrui2 2010-03-27 09:25:14
现在在做一个程序,在mobile平台上开发,用的是api,现在在做一个控件,类似于IPHONE android 主界面那样可以拖动界面图标
现在有个问题,就是带有渐变效果的png图片,图片四周还有透明部分 用iimage com组件绘制的话 效果不错,但是速度慢
一拖动每次绘制相当卡, 如果事先画到一个内存DC保存下来,在每次绘制到屏幕,这样速度虽然快,但是不能很好的处理渐变色问题,用TransparentBlt处理 渐变色部分颜色不对,网上也试验了一些遮罩效果,貌似也不行

http://www.52design.com/pic/200712/2007121111285410.png 这里是一张类似图片 这个足球周围就有一些渐变色,图片四周还有透明部分......
有没有高手教教呀 很急谢谢
...全文
542 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
guogangj 2010-08-06
  • 打赏
  • 举报
回复
AlphaBlend是需要大量运算的,要加速只能考虑自己自行利用CPU的mmx等指令来实现alpha混合了。
我曾经整理过一篇文章,虽然关联性不是很强,不过可能有点用:http://www.cppblog.com/guogangj/archive/2010/06/20/118316.html
blue601 2010-08-05
  • 打赏
  • 举报
回复
占地看答案
zerocnd 2010-08-03
  • 打赏
  • 举报
回复
这个确实很慢,我现在的做法是自己解析,没用系统函数,需要根据公式,计算当前点和背景点的alpha混合,

现在是一个点一个点的计算,如果图片很大的话,循环里的效率就很慢,

不知道谁有好的方法
载舟之水 2010-07-30
  • 打赏
  • 举报
回复
我解决这个问题花了挺长时间的,基本思路就是自己算,因为IImage的Draw方法,用了浮点,所以是不行的,你只需要用到它解码就行了。
Joe-xXx 2010-07-30
  • 打赏
  • 举报
回复
半透明:AplhaBlend
渐变:GradientFill

效率优化就看你自己怎么画了,可以双缓冲,使用底层的图形库
bluesea995 2010-07-28
  • 打赏
  • 举报
回复
最后有结果了么?
fruifrui2 2010-04-03
  • 打赏
  • 举报
回复
。。。。额 楼上哥们好小气呀~没事。我也是只是个人兴趣爱好研究下
Abcix 2010-04-02
  • 打赏
  • 举报
回复
这个就不告诉你了,我们是同行,呵呵。其实很容易实现。
fruifrui2 2010-04-02
  • 打赏
  • 举报
回复
没有收到你发hekediguo2002@sina.com 吧。jumpchess1 的方法好像也不行
oh_my_god 2010-04-02
  • 打赏
  • 举报
回复
qq给你私信了,ALPHABLEND IIMAGE都不会有DDraw快的,但是在mobile如果加载图片太多下就算DDraw也会有屏幕闪烁,现在都是用双缓存的技术来处理,虽然更慢了,但从视觉上感觉觉得很快。
beyondma 2010-04-01
  • 打赏
  • 举报
回复
ALPHABLEND就很慢了,IIMAGE更慢。除非你用DDRAW否则没办法快速写屏。
fruifrui2 2010-04-01
  • 打赏
  • 举报
回复
对了我那个QQ空间的图片怎么又显示不出来了。。不行点下图片属性。得到URL地址看下吧。。CSDN发图难呀

AlphaBlend 函数不是会把整个按钮全部设置成半透明了么。。这样不好吧。
现在拖动图标,图标所在位置的背景区域肯定是随时在变化的。。所以现在是想在内存DC里先画黑,在画图,
每次往屏幕上TransparentBlt的时候过滤黑色,这样可以再图片移动的过程中,图片里面透明的部分可以显示所在区域的背景。。。但是就是这个PNG图片为了有很好的显示效果,他做了渐变色处理。就是淡进淡出的那种效果,TransparentBlt不能很好的处理这个问题。。就导致图片里面的样子。

oh_my_god 大哥 你有QQ么?我加你详谈呀
oh_my_god 2010-04-01
  • 打赏
  • 举报
回复
看了下,TransparentBlt的锯齿问题,这函数对图片处理很容易搞出来锯齿。锯齿的原因是因为你的按钮的背景没有图片,CreateCompatibleBitmap的时候把位图弄成黑的了,然后你在黑的空白位图上IImage Draw,当然就会出现黑色的背景出来。你再把这个位图TransparentBlt到窗体上,产生了锯齿。
你是要把那个按钮做成控件?感觉不好处理,你不如把按钮隐藏了,只根据按钮的位置,然后在窗体上画出来。这种处理就像是在做win32的API编程了。不过是解决你按钮黑背景的问题的一种方式。
另外你也可以考虑AlphaBlend,这个函数也可以处理透明度。
fruifrui2 2010-04-01
  • 打赏
  • 举报
回复

这个是我先用一个内存DC , 全画黑,在往里面画PNG图像, 在拖动图片的时候每次都TransparentBlt 上去。。设置过滤色为黑色 按钮下面有渐变色的部分就是有点处理不好。是黑色
jumpchess1 2010-04-01
  • 打赏
  • 举报
回复
我知道静态的怎么做, 如果要做拖动, 你可以试一下.
应该至少有两张图片.
一张是png图片(即足球, 包括周围的阴影. 当然图片肯定是正方形的, 所有除了足球和阴影, 周围都是透明的, PNG图片可以做)

然后一张是背景.

用image com的方法得到句柄 HBITMAP.(这种方法不会过滤掉 Alpha 通道. 即透明通道.)
然后用ALPHABLEND , 透明度选255
/******************************************************************/
#define ICON_TRANSPARENT 255

SAlphaBlend.BlendOp = AC_SRC_OVER;
SAlphaBlend.BlendFlags = 0;
SAlphaBlend.SourceConstantAlpha = ICON_TRANSPARENT;
SAlphaBlend.AlphaFormat = AC_SRC_ALPHA;

if (!AlphaBlend(pdi->hDC, rcLabel.left + ICON_X_OFFSET, rcLabel.top + ICON_Y_OFFSET, ICON_W, ICON_H,
hCpDCIcon, 0, 0, ICON_W, ICON_H, SAlphaBlend))
{
;
}
/******************************************************************/
这样透明的就是透明的, 没有透明的就一点也没有透明.
不过拖动会不会慢(拖动可不可以实现.)
这个只有你去试一下了.

我的QQ 342225548.




fruifrui2 2010-04-01
  • 打赏
  • 举报
回复
是的,ALPHABLEND IIMAGE都很慢。。其实TransparentBlt也很慢。。。。在大分辨率的屏幕下就能看出效果了。。
fruifrui2 2010-03-31
  • 打赏
  • 举报
回复
9楼的大哥。。你说的我知道。。现在关键是我现在要支持拖动。。图片要移动的。。每次用IIMAGE 画会很卡。。先画到内存DC里面的话,因为每次拖动图片背景都是变化的。。所以内存DC里面的需要透明的部分 不知道怎么处理 简单的TransparentBlt 是不能处理的
现在做的效果就想像android 主界面那样,只是他的图标有可能很炫 不想android 一样只是一个小方块图标
bsr2009 2010-03-31
  • 打赏
  • 举报
回复
把图片上传到你空间上,然后用图片插入互联网图片的方式,就可以显示了.
oh_my_god 2010-03-31
  • 打赏
  • 举报
回复
怎么处理不了渐变的问题?是你用的方法不对而已。png如果在mobile下实现渐变最好用IImagingFactory,而不是简单的TransparentBlt 。
1、创建一个内存DC,CreateCompatibleDC,CreateCompatibleBitmap
2、把背景图BitBlt到内存DC上。
3、IImagingFactory读出来png图片,IImage Draw到内存DC上,这样的png图片才能透明。
4、把memdc上的位图再BitBlt到屏幕DC上
向立天 2010-03-31
  • 打赏
  • 举报
回复
把图片放到你空间的相册里就可以带上来了
加载更多回复(7)

7,656

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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