实现任意角度渐变填充(二) -- 多色渐变填充矩形

    在《实现任意角度渐变填充(一) -- 双色渐变填充矩形》一文中,比较详细的阐述了任意角度双色渐变填充矩形的原理,同时也用Delphi实现了填充过程,本文在此基础上,继续实现对矩形的任意角度多色渐变填充。

    其实,任意角度多色渐变填充与任意角度双色渐变填充在实现原理上没有什么不同,填充过程也是完全相同的,只需要修改一下设置颜色缓冲区的代码,将按长度比例计算2种颜色缓冲区各元素颜色值,改为按多种填充颜色分段后,按各自的长度比例计算其在颜色缓冲区各元素颜色值就行了。

    下面是修改过的获取颜色缓冲区的过程代码:

    从上面的代码可以看出,GetGradientColors过程中的子过程SetColors其实就是《实现任意角度渐变填充(一) -- 双色渐变填充矩形》中的SetGradientColors过程(重组前的设置双色填充缓冲区过程),GetGradientColors过程只是将多种填充颜色,按其在矩形填充的位置比例重复调用设置双色填充颜色而已。

    下面是任意角度多色渐变填充矩形的全部代码:

    由于任意角度双色渐变填充矩形过程只是任意角度多色渐变填充矩形的特例,所以任意角度双色渐变填充矩形过程可以写为下面的形式,而不必在写专门的任意角度双色渐变填充矩形过程,不过,如果想搞清楚渐变填充原理和实现代码的演变过程,还是应该参考《实现任意角度渐变填充(一) -- 双色渐变填充矩形》一文。

    为了更进一步提高填充速度,下面也给出LinearFillRect过程的BASM代码:

    使用LinearFillRect的纯pas代码过程,在我的p4 2.8G 单核处理器计算机上,模拟填充千万象素大小矩形,实拷贝填充时间为47ms,而Alpha填充时间则为243ms;而采用LinearFillRect的BASM过程填充千万象素大小矩形测试时间分别为31ms和78ms。可以看出,BASM过程对实拷贝填充速度提升并不大,只有50%,而对Alpha填充而言,填充速度提升还是很可观的,是纯pas代码填充过程的3倍多。以这样的填充速度去填充程序矩形界面,应该还是较满意的,毕竟一般的显示屏,填充整屏也就几十至一百万左右的象素数量。

   本文的内容也适用于对图像矩形的多色渐变填充,只不过要进行一些数据转换,如对本人的《Delphi图像处理》系列文章里使用的图像数据结构的任意角度多色渐变填充矩形过程就可以是下面的形式:

    上面代码中的数据类型TImageData及图像数据转换过程见《Delphi图像处理 -- 数据类型及内部过程》和《Delphi图像处理 -- 图像像素结构与图像数据转换》。如果使用《Delphi图像处理 -- 图像像素结构与图像数据转换》中的GetSubImageData过程也可实现图像的局部矩形填充。

    下面是个调用多色渐变填充矩形过程填充窗口矩形的简单例子:

   例子运行界面截图如下:

运行界面截图

    指导和建议请来信:mao.maozefa@gmail.commaozefa@hotmail.com

    后记:本文的填充过程支持ARGB颜色填充,GetGradientColors过程就是采用常规ARGB合成方法计算的颜色缓冲区各元素的颜色值,后经CSDN网友winnuke指出:如果填充颜色的Alpha小于255时,按常规ARGB合成方法计算的颜色会导致人眼视觉偏差,必须先将颜色的RGB按Alpha进行预乘,即转换为PARGB格式后进行合成,合成完毕后再转换回ARGB格式(见《http://topic.csdn.net/u/20091118/20/4f96e8c5-dcea-41ae-ac07-492526462b9d.html?64533》)。为此,本文对GetGradientColors进行了修改,但《实现任意角度渐变填充(一) -- 双色渐变填充矩形》一文中的SetGradientColors没作修改,因为那篇文章的内容只是作为本文的导入篇,就让它保持原貌吧。在这里再次对网友winnuke表示感谢

 

发布了132 篇原创文章 · 获赞 31 · 访问量 100万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览