Photoshop选区技术编程实现方法研究

最近在做图形图像处理软件,需要在原有基础上,深化选区功能。
在Windows系统上,简单的选区功能其实只需要GraphicPath就可以了,但如果只是用GraphicPath技术的话,多选区、嵌套选区、魔术棒、选区的增删和异或操作就比较难于实现。
通过在Codeproject上的The Secret of Marching Ants
http://www.codeproject.com/KB/selection/marchingants.aspx 和The Secret of Marching Ants 
http://www.codeproject.com/Articles/27748/Marching-Ants
两篇文章以及GIMP的研究,有了一些小的进展
     高阶选区功能的实现,我使用二值图当模版,无论是矩形、圆形、多边形还是魔术棒选区都先在一个二值图上绘制其形状(背景黑色,形状白色),
之后采用轮廓提取获得轮廓二值图,提取算法比较简单,只判断四连通区域,分别判断每个像素的上下左右四个像素是否为白色,若为白色,此像素
为图形内点,将其变为黑色,这样处理之后就会剩下一个轮廓图。轮廓图获取之后采用轮廓跟踪算法,按顺序获取每个选区的轮廓点。其算法为:先查找轮廓图中每个像素若为轮廓点则进行跟踪,跟踪到轮廓点之后需要将其置黑,以防止多次扫描。这样就能够将区域中的每个选区都扫描跟踪到了。跟踪的算法可以采用顺时针检测方式,将每个轮廓像素的周围八个点按顺时针方式进行检测,实现时采用一个【8,2】的二维数组,和一个方向变量。二维数组中按顺时针方向进行初始化
{{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}}
用方向变量只想二维数组,每增加一个方向就顺时针旋转45度。若其为白色像素,则记录下来,当前回到初始点时,就完成了一个路径的跟踪。
关于轮廓路径还需要一个特别的数据结构,类似一个链表数组,每个数组都是一个轮廓链表,每个链表中存储嵌套轮廓,也就是一个大的轮廓中含有一个小轮廓,这个小的轮廓就和其父轮廓组成一个链表,数组元素代表着一个父轮廓。这样就可以保存其相应的嵌套轮廓了。
当然,这个算法还需要处理单像素选区和边界选区的问题,这里就不赘述了。
另外,这样得到的是一个一个路径点的数组,这时可以使用GraphicPath对轮廓路径进行绘制了,当然如果不使用GDI+,其他的图形引擎也提过类似的功能,比如Cario中就有路径的概念。
这样保证选区的扫描性能为线性时间,且时间复杂度只随着图像的区域增加而增加。
至于选区蠕动效果,可以参考上面两篇文章,只是Pen的材质设置外加一个定时器就可以了,但上面两篇文章不支持魔术棒操作,呵呵。
初次接触这个功能,还有很多要做,但是由于我所在的项目是自然绘画软件,所以对选区的功能要求没有PS这种修图软件高,这篇文章只是记录一下思考和基本实现过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值