正在阅读:用Delphi来DIY一个软件"变脸"功能用Delphi来DIY一个软件"变脸"功能

2004-12-30 10:36 出处: 作者:islet8 责任编辑:linjixiong

  接下来我打算把PNG图片放到TImage控件里来做成模拟的按钮。这个比较简单,经过几下尝试,发现只要“Image1.Picture.Assign(Png);”这一句就可以了,同样很好的显示了渐变透明的效果。(注:不能使用“Image1.Picture.Bitmap.Assign(Png);”,虽然这句代码能画出图形,但对于透明是无可奈何的,全部变成黑色;另外不可使用“Image1.Assign(Png);”或“Image1.Picture.Bitmap.Canvas.Assign(Png);”,否则产生运行时类型转换错误,因为TPngObject根本不能转换为TImage或者TBitmapCanvas类型。)另外对于TImage控件中已经有图片的情况,想要将PNG图片盖上去,可以使用TPngObject对象的Draw方法:


  Rect.Left := 0;
  Rect.Top := 0;
  Rect.Right := Rect.Left + Png.Width;
  Rect.Bottom := Rect.Top + Png.Height;

  Png.Draw(Image1.Canvas, Rect);
  Image1.Refresh;

  注意:此处不能使用TImage的方法,不然原图就没了;而且还需要调用TImage.Refresh后才能显示更改后的图片(如图2,左边是显示单PNG图片,右边是将PNG图片盖到已有的位图上去)。


  说了这么多,现在该考虑我们的重点内容“换肤色”了。我考虑的基本原理是:先将所有界面相关的图片都做成灰阶PNG图片,可以做出颜色渐变、立体等各种效果;然后用指定的色彩“蒙”到灰阶图片上去。想起来简单,可实际动起手来发现还是碰到了好多问题。因为对RGB颜色和位图只了解一点,一开始便胡乱猜想是不是拿灰阶图片中的某一点像素的RGB值去和指定颜色的RGB值做逻辑与运算(呵呵,让人笑话了),编了点代码试了试,对于几种颜色(黑、白、红、绿、蓝、黄、桃红)的确能“蒙”出正确颜色来(通过和做图软件中得出的效果进行比较),可其他的比如渐变色、非常规色等,就拿刚才前面用到的Winamp5主界面的图片,转出来后变成了大花脸。。。唉,别偷懒,还是好好分析一下吧。

  < 动脑 >

  以“浅色-深色”渐变图片为例,假设我们要将所有含“深色”色的像素转成指定色彩,也就是要转成类似白-红、浅黄-深黄渐变的效果。我们知道TColor其实是用一定范围的十六进制数值来表示的,从低位到高位每个字节分别保存红、绿、蓝的值。对于灰阶色来说,每一种“灰色”其R、G、B的三值是相等的,从黑(RGB(0,0,0))到白(RGB(255,255,255))。经过一段时间的琢磨,我发现对某一像素点的色彩转换大致的思路应该是:

  该点目标色离白色的“距离”(之间的值差,姑且这样称呼吧)/指定彩色离白色的“距离” = 该点灰色离白色的“距离”/最深色离白色的“距离”

  这里的“距离”其实分别是该种颜色的R、G、B三值和255的差的绝对值。有点昏了是吧?呵呵,其实应该是比较好理解的,直观一点的原始公式(分别计算R、G、B三值)是:

  (255 - 目标色R值) / (255 - 指定色R值) = (255 - 灰色R值) / (255 - 最深色R值)

  移项后可得解:

  目标色R值 = 255 - (255 - 灰色R值) * (255 - 指定色R值) / (255 - 最深色R值)

热点推荐: 
教你如何成为一名Java初级程序员变态级JAVA程序员面试32问(附答案)
将Asp.Net页面输出到EXCEL里去读书笔记:程序员的个人性格
Java编程学习:自己DIY一个JSP日历Java 的破解和反破解之道
网页编程必看:XML文法分析设计模式的有趣解释-追MM

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品