当前位置:编程学习 > wap >>

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

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

/upload/20131225/2007121111285410.png 这里是一张类似图片 这个足球周围就有一些渐变色,图片四周还有透明部分......
有没有高手教教呀 很急谢谢 --------------------编程问答-------------------- 哎呀不好意思。。这个还盗链了。。/upload/20131225/2007121111285410.png
这个是图片下载地址 --------------------编程问答-------------------- http://www.z6688.com/info/47862-1.htm --------------------编程问答-------------------- 这个问题最好在移动平台版提问
我帮你移过去 --------------------编程问答--------------------
引用 2 楼 an_bachelor 的回复:
http://www.z6688.com/info/47862-1.htm

2楼的大哥。。我说的不是程序画渐变色。。是PNG图片里面就有渐变色。。 --------------------编程问答-------------------- 只能帮顶了.没遇到过这问题. --------------------编程问答-------------------- 感觉你做了一半,你现在做了一个内存DC,为什么不把png贴到这个DC上来,然后把内存DC上的图片再BitBlt到屏幕上来? --------------------编程问答-------------------- 我就把PNG 贴到一个内存DC 里面,然后在绘制到屏幕上。。这样速度快,但是解决不了PNG图片有渐变色问题
TransparentBlt 对PNG图像里面渐变色部分处理不的好。。用TransparentBlt绘制到屏幕上有渐变色的部分明显有问题
/upload/20131225/2007121111285410.png
这里有足球的PNG图片 足球周围就有渐变色。。
哪位大哥会的话留下邮箱或者QQ 谈论下呀。。
对了这个论坛怎么贴图。。也许我贴图上来大家就明白我在说啥了。。 --------------------编程问答-------------------- 把图片放到你空间的相册里就可以带上来了 --------------------编程问答-------------------- 怎么处理不了渐变的问题?是你用的方法不对而已。png如果在mobile下实现渐变最好用IImagingFactory,而不是简单的TransparentBlt 。
1、创建一个内存DC,CreateCompatibleDC,CreateCompatibleBitmap
2、把背景图BitBlt到内存DC上。
3、IImagingFactory读出来png图片,IImage Draw到内存DC上,这样的png图片才能透明。
4、把memdc上的位图再BitBlt到屏幕DC上
--------------------编程问答-------------------- 把图片上传到你空间上,然后用图片插入互联网图片的方式,就可以显示了. --------------------编程问答-------------------- 9楼的大哥。。你说的我知道。。现在关键是我现在要支持拖动。。图片要移动的。。每次用IIMAGE 画会很卡。。先画到内存DC里面的话,因为每次拖动图片背景都是变化的。。所以内存DC里面的需要透明的部分 不知道怎么处理 简单的TransparentBlt 是不能处理的
现在做的效果就想像android 主界面那样,只是他的图标有可能很炫 不想android 一样只是一个小方块图标 --------------------编程问答-------------------- [img=http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=4a2718a21ca75c7c145d76bd092457eeee06ab5778ec9c4ee150751bf20ae847df19f74150b6b818fafffbd702749b918bea3cb4d828dd452490a4582e1067702f33b148d4162c81704d118aa566f06425f5b27b&a=34&b=30][/img]
这个是我先用一个内存DC , 全画黑,在往里面画PNG图像, 在拖动图片的时候每次都TransparentBlt 上去。。设置过滤色为黑色 按钮下面有渐变色的部分就是有点处理不好。是黑色 --------------------编程问答-------------------- 看了下,TransparentBlt的锯齿问题,这函数对图片处理很容易搞出来锯齿。锯齿的原因是因为你的按钮的背景没有图片,CreateCompatibleBitmap的时候把位图弄成黑的了,然后你在黑的空白位图上IImage Draw,当然就会出现黑色的背景出来。你再把这个位图TransparentBlt到窗体上,产生了锯齿。
你是要把那个按钮做成控件?感觉不好处理,你不如把按钮隐藏了,只根据按钮的位置,然后在窗体上画出来。这种处理就像是在做win32的API编程了。不过是解决你按钮黑背景的问题的一种方式。
另外你也可以考虑AlphaBlend,这个函数也可以处理透明度。 --------------------编程问答-------------------- 对了我那个QQ空间的图片怎么又显示不出来了。。不行点下图片属性。得到URL地址看下吧。。CSDN发图难呀

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

oh_my_god 大哥 你有QQ么?我加你详谈呀
--------------------编程问答-------------------- ALPHABLEND就很慢了,IIMAGE更慢。除非你用DDRAW否则没办法快速写屏。 --------------------编程问答-------------------- 是的,ALPHABLEND IIMAGE都很慢。。其实TransparentBlt也很慢。。。。在大分辨率的屏幕下就能看出效果了。。 --------------------编程问答-------------------- 我知道静态的怎么做, 如果要做拖动, 你可以试一下.
应该至少有两张图片.
一张是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.




--------------------编程问答-------------------- qq给你私信了,ALPHABLEND IIMAGE都不会有DDraw快的,但是在mobile如果加载图片太多下就算DDraw也会有屏幕闪烁,现在都是用双缓存的技术来处理,虽然更慢了,但从视觉上感觉觉得很快。 --------------------编程问答-------------------- 没有收到你发hekediguo2002@sina.com 吧。jumpchess1 的方法好像也不行 --------------------编程问答-------------------- 这个就不告诉你了,我们是同行,呵呵。其实很容易实现。 --------------------编程问答-------------------- 。。。。额 楼上哥们好小气呀~没事。我也是只是个人兴趣爱好研究下 --------------------编程问答-------------------- 最后有结果了么? --------------------编程问答-------------------- 半透明:AplhaBlend
渐变:GradientFill

效率优化就看你自己怎么画了,可以双缓冲,使用底层的图形库 --------------------编程问答-------------------- 我解决这个问题花了挺长时间的,基本思路就是自己算,因为IImage的Draw方法,用了浮点,所以是不行的,你只需要用到它解码就行了。 --------------------编程问答-------------------- 这个确实很慢,我现在的做法是自己解析,没用系统函数,需要根据公式,计算当前点和背景点的alpha混合,

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

不知道谁有好的方法 --------------------编程问答-------------------- 占地看答案 --------------------编程问答-------------------- AlphaBlend是需要大量运算的,要加速只能考虑自己自行利用CPU的mmx等指令来实现alpha混合了。
我曾经整理过一篇文章,虽然关联性不是很强,不过可能有点用:http://www.cppblog.com/guogangj/archive/2010/06/20/118316.html
补充:移动开发 ,  Windows Phone
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,