閺€鎯版 (0) +1 鐠э拷 (0) +1 闊拷 (0) +1
閺€鎯版閹存劕濮�閺屻儳婀呴弨鎯版>>

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

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

  目标看似达到了,不过看看这粗糙的算法吧,二重循环遍历每个象素一定是很慢的,测试了一下转换这张200*200(象素)耐计赑4 2.4的CPU下耗时平均94ms(上面我用了一个RGBTemp临时变量来保存当前像素的RGB值,要不然在计算R、G、B时分别去直接读PNG.Pixels[i,j]的话时间基本要再翻倍)。天!这个耗时很可观哪!后来我把代码改成把图片的ScanLine属性复制到一个指针数组,大大提高了运算速度:

  { 定义指针数组类型 }


  const
  MaxPixelCount = 65536;

  type
  PRGBArray = ^TRGBArray;
  TRGBArray = array [0..MaxPixelCount - 1] of TRGBTriple;

  procedure TForm1.Button3Click(Sender: TObject);
  var
  i, j: Integer;
  Row: PRGBArray;
  Png: TPngObject;
  Rect: TRect;
  begin
  Png := TPngObject.Create;
  Png.LoadFromFile('2.png');

  for i := 0 to Png.Height - 1 do
  begin
  Row := Png.Scanline[i];  // 复制ScanLine属性到Row指针数组
  for j := 0 to Png.Width - 1 do
  begin
  Row[j].rgbtRed := 255 - (255 - Row[j].rgbtRed) * (255 - 153) div 255;
  Row[j].rgbtGreen := 255 - (255 - Row[j].rgbtGreen) * (255 - 0) div 255;
  Row[j].rgbtBlue := 255 - (255 - Row[j].rgbtBlue) * (255 - 0) div 255;
  end;
  end;
  { ... }
  { 后面的画图片代码相同 }

  经过这个算法优化,运行时间缩短到几乎为0ms了(偶尔出现16ms)!

  < 收工 >

  总算写完了^^。以上算法是我自己琢磨出来的,网上也没找到什么相关资料,哪位朋友如果有更好的方法,请多多指点,也希望能和我联系(islet8@yahoo.com.cn)。希望这篇文章能给各位朋友起到抛砖引玉的作用!

  以上代码在WinXP + Delphi7下调试通过。

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

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
閹靛婧€鐠佸潡妫�閸ョ偛鍩屾い鍫曞劥