狂高兴+散分:成功搞定photoshop中的魔术棒功能。效果以及性能都非常好。 蠕动效果在也不占用什么CPU了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://p.blog.csdn.net/images/p_blog_csdn_net/laviewpbt/EntryImages/20080731/321312312313.JPG 希望楼主的China PhotoShop早日完工,楼主一个人搞定这么复杂的东东,不简单啊! 对PHOTOSHOP不太熟悉 能用好photoshop的是高手 恭喜楼主了 稍微谈一下实现魔术棒的大体思路吧。魔术棒主要包括两项任务,一是蠕动选区的实现,二是如何确定选区的范围。仔细观察photoshop中的选区,可以发现她有几个合并方式:1、新建 2相加 3 相减 4相交 ,而windows中与这个结构相类似的就有一个Region对象,因此,选用Region对象作为选区实现的基体应该是个好方法。为了达到蠕动效果,我们可以预先创建好一些纹理刷子,这个可以用CreatePatternBrush函数实现,这个函数不是有一个hBitmap参数吗。用一个Timer控件实现轮回改变刷子,SelectObject。至于显示,我也走了不少弯路,很自然的我们会想到FrameRgn,不错,这个函数在简单的选区时表现了较好的性能,但是当构成RGN的数据结构复杂, FrameRgn的性能则大大的下降,会导致CPU的使用率长期在100%左右,并且由于是调用API函数导致的100%,在任务管理器里也很难强制结束。因此,该函数不适合于使用在此处,为了解决这个问题,可谓是一直放在那里有1年多啊,直到前不久看到网上有人写得自己提取选区边缘的代码,并偶然用FillRgn代替了FrameRgn,蠕动的速度立即得到了解决。2.选区的范围的确定:对于不连续的,也就是全局范围的魔术棒,可以借用于网络上流传的制作图形窗体的代码,但是制作图形窗体的图片一般都有一个特征,就是图像除了两端和我们设置的maskcolor一致外,中间的区域都是我们窗体要显示的地方,但是对于任意图像,显然不具有这一特征,因此,在直接借用网络流传代码时,发现的主要问题就是速度慢,究其原因,是代码中的不断的CreateRectRgn和CombineRgn所导致,解决方法就是先扫描一行,得到选区的矩形数组结构,并借助于相关API函数一次性创建区域。这样大大的提高了速度。 对于连续的,正如大家所想的,可以借助于数字图像学中的种子填充等算法实现,这里经过探索,发现用递归实现完全不现实,因为大量的递归会导致堆栈溢出,因此要找到用非递归的方法实现种子填充,这方面的资料网络上有一些VC的代码,我也是按照那些代码坐相应的改动而实现的。 不错~~虽然我对GUI相关编程不在行,也不知道这个东西的技术难度,但是想来应该是非常“变态”的了,希望楼主早日完成china photoshop 单就抠图而言,photoshop自带的魔术棒其实效果并不怎样,但另有一间公司出了个抠图的插件Mask Pro就强多了,现在不知出到什么版本,楼主有兴趣可以找找,试试是否可以在你的软件里增加类似的功能支持楼主 非常的不错,隆重地支持你!不过,我觉得你应该用C++,也许对你来说要容易些!VB做这些是很难的! 东方之珠 我严重的不他同意你的说法, 反倒是队我来说用C++难些。 VB照样速度快。 厉害....一段时间不见,又有突破了.....刚回到老窝,上网不方便,在整网线中.那就是说我能拿多点分了?HOHOHOHO~~~ China PhotoShop?楼主使用PhotoShop?还是开发类似软件?开发的话,真的很强。 怎么样才能使VB6的编程环境成为 unicode 下的编程? VB2005中多个groupbox重叠显示的问题 啊啊啊~胸闷啊!又是TNND暴跌……偶滴血汗钱啊! 如何把文件以二进制形式读进数据库? 请教如何在MSHFLEXGRID中某一列显示CheckBox? 如何封装啊!(如果我说的这个也叫封装,我不太明白) 关于MSHFlexGrid+Adodc,怎么在代码里写去绑定.一定要在属性面里设置吗?不可能吧!! 这里有没有用过realbasic的朋友 关于窗口风格!!! 如何在VB里自己制作象VC里的飘浮工具条? 在VB 中倒三角形怎么编写程序 vbscript怎样向其它程序的窗口发送消息?
支持楼主
不过,我觉得你应该用C++,也许对你来说要容易些!VB做这些是很难的!
那就是说我能拿多点分了?HOHOHOHO~~~
楼主使用PhotoShop?还是开发类似软件?
开发的话,真的很强。