注册 登陆

转 DELPHI 图片图形图像处理 PS置换滤镜效果,亮度/对比度,纹理贴图效果

DELPHI 图片图形图像处理 PS置换滤镜效果,亮度/对比度,纹理贴图

以前没弄过DELPHI,最近学了1个多星期时间,无聊时候吧以前用C#写的部分图像处理代码转换成DELPHI,竟然发现D处理图片的速度比C#快了20倍··················D处理图片0.3s,C#处理同一图片6s多 ,差距真大·····················我写的算法调用GDI函数,无汇编便于理解,觉的好的顶一个,顶的多就发布下一篇图像处理,转帖的话请写明转帖和原作者 胡睿 QQ 235483710 EMAIL: jennievictor@163.com

欢迎大家交流技术。D没学多久,有些地方没写好的别见怪,有优化的大家优化吧,把成果共享下。

 

 

  1. //==============================================================================
  2. // 图像处理程序 , 纹理与背景融合算法  未优化版
  3. // 作者 : 胡睿   QQ :235483710, Email :jennievictor@163.com
  4. // 创建日期 : 2008/9/2
  5. // 承接手机程序开发,windows程序开发,图形图像处理开发,数据库开发等外包业务
  6. // 主打 .net, SqlServer 2K , Oracle , J2me , WM
  7. //==============================================================================
  8. unit Main;
  9.  
  10. interface
  11.  
  12. uses
  13.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  14.   Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, jpeg, StrUtils, FmtBcd ;
  15. type
  16.   TForm1 = class(TForm)
  17.     BitBtn1: TBitBtn;
  18.     BitBtn2: TBitBtn;
  19.     OpenDialog1: TOpenDialog;
  20.     OpenDialog2: TOpenDialog;
  21.     GroupBox1: TGroupBox;
  22.     Image1: TImage;
  23.     GroupBox2: TGroupBox;
  24.     Image2: TImage;
  25.     BitBtn3: TBitBtn;
  26.     TrackBar1: TTrackBar;
  27.     Button2: TButton;
  28.     Label7: TLabel;
  29.     Label8: TLabel;
  30.     Label1: TLabel;
  31.     TrackBar2: TTrackBar;
  32.     TrackBar3: TTrackBar;
  33.     Label2: TLabel;
  34.     Button1: TButton;
  35.     Label3: TLabel;
  36.     TrackBar4: TTrackBar;
  37.     Label4: TLabel;
  38.     TrackBar5: TTrackBar;
  39.     TrackBar6: TTrackBar;
  40.     Label5: TLabel;
  41.     Label6: TLabel;
  42.     Button3: TButton;
  43.     Label9: TLabel;
  44.     procedure FormCreate(Sender: TObject);
  45.     procedure BitBtn3Click(Sender: TObject);
  46.     procedure BitBtn1Click(Sender: TObject);
  47.     procedure BitBtn2Click(Sender: TObject);
  48.     procedure TrackBar1Change(Sender: TObject);
  49.     procedure TrackBar2Change(Sender: TObject);
  50.     procedure TrackBar3Change(Sender: TObject);
  51.     procedure Button2Click(Sender: TObject);
  52.  
  53.     // 处理移动图像
  54.     // 参数定义   bmpBackGround1 背景图片
  55.     //            bmpTexture1 纹理图片
  56.     //            moveX 纹理开始区域在背景图中X坐标
  57.     //            moveY 纹理开始区域在背景图中Y坐标
  58.     // 返回  Bitmap移动后的图片
  59.     function createMoveImg( bmpBackGround1 : TBitmap ; moveX : Integer ; moveY : Integer) : TBitmap;
  60.  
  61.     // 处理混合图像
  62.     // 参数定义   bmpBackGround1 背景图片
  63.     //            bmpTexture1 纹理图片
  64.     //            moveX 纹理开始区域在背景图中X坐标
  65.     //            moveY 纹理开始区域在背景图中Y坐标
  66.     // 返回  Bitmap混合效果特效图片
  67.     function createMixImg( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
  68.  
  69.     // 处理图像置换
  70.     // 参数定义   bmpBackGround1 背景图片
  71.     //            bmpTexture1 纹理图片
  72.     //            moveX 纹理开始区域在背景图中X坐标
  73.     //            moveY 纹理开始区域在背景图中Y坐标
  74.     // 返回  Bitmap混合置换特效图片
  75.     function replacementEffect( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
  76.  
  77.     //调节背景图亮度对比度
  78.     //参数定义    brightness 亮度
  79.     //            contrast 对比度
  80.     function BrightnessAndContrast( brightness : Integer ; contrast : Integer ) : TBitmap ;
  81.  
  82.     procedure Button1Click(Sender: TObject);
  83.     procedure TrackBar4Change(Sender: TObject);
  84.     procedure TrackBar5Change(Sender: TObject);
  85.     procedure TrackBar6Change(Sender: TObject);
  86.     procedure Button3Click(Sender: TObject);
  87.  
  88.   private
  89.     { Private declarations }
  90.   { procedure BlendBmp(Bmp : TBitmap; BlendValue: Byte);//透明度处理 }
  91.  
  92.   public
  93.     { Public declarations }
  94.   end;
  95.  
  96. var
  97.   Form1 : TForm1 ;
  98.  
  99.   bmpBackGround : TBitmap ; //背景位图
  100.  
  101.   bmpTexture : TBitmap ; //纹理位图
  102.  
  103.   isLoadBackGround : Boolean ; //是否已经加载背景图
  104.  
  105.   isLoadTexture : Boolean ; //是否已经加载纹理图
  106.  
  107.   alphaValue : Integer ; //alpha数值
  108.  
  109. implementation
  110.  
  111. {$R *.dfm}
  112. //==============================================================================
  113. // 图像处理程序 , 纹理与背景融合算法  未优化版
  114. // 作者 : 胡睿   QQ :235483710, Email :jennievictor@163.com
  115. // 创建日期 : 2008/9/2
  116. // 承接手机程序开发,windows程序开发,图形图像处理开发,数据库开发等外包业务
  117. // 主打 .net, SqlServer 2K , Oracle , J2me , WM
  118. //==============================================================================
  119. //==============================================================================
  120. // 窗体初始化
  121. //==============================================================================
  122. procedure TForm1.FormCreate(Sender: TObject);
  123. begin
  124.  
  125.   //窗体初始化位置
  126.   OpenDialog1.Title := '请选择图片文件,Demo仅支持bmp' ;
  127.  
  128.   OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName) ;
  129.  
  130.   OpenDialog2.Title := '请选择图片文件,Demo仅支持bmp' ;
  131.  
  132.   OpenDialog2.InitialDir := ExtractFilePath(Application.ExeName) ;
  133.  
  134.   Form1.Top := -20 ;
  135.  
  136.   Form1.Left := 11 ;
  137.  
  138.   //初始化位图
  139.   bmpBackGround := TBitmap.Create ; //背景位图
  140.  
  141.   bmpTexture := TBitmap.Create ; //纹理位图
  142.  
  143.   self.DoubleBuffered := true ; //打开双缓冲
  144.                                              
  145. end;
  146.  
  147.  
  148. //==============================================================================
  149. // 混合溶解,产生特效图片
  150. //==============================================================================
  151. procedure TForm1.BitBtn3Click(Sender: TObject);
  152. begin
  153.  
  154.     GroupBox1.Caption := '特效图片' ;
  155.  
  156.     if isLoadTexture = True and isLoadBackGround = True then
  157.       begin
  158.       
  159.          Image1.Picture := nil ; //释放图片
  160.  
  161.          Image1.Canvas.Draw( 0 , 0 , createMixImg( bmpBackGround ,bmpTexture , TrackBar2.Position , TrackBar3.Position ) );
  162.  
  163.          Image1.Canvas.TextOut( 60,60,'DEMO 胡睿制作 QQ : 235483710 ' );
  164.  
  165.       end
  166.     else
  167.       begin
  168.  
  169.          ShowMessage( '请先载入纹理图片及背景图片' ) ;
  170.  
  171.       end;
  172.  
  173. end;
  174.  
  175.  
  176. //==============================================================================
  177. //打开背景文件,选择框加载图片
  178. //==============================================================================
  179. procedure TForm1.BitBtn1Click(Sender: TObject);
  180. begin
  181.  
  182.     //打开文件选择框加载图片
  183.     OpenDialog1.Execute ;
  184.  
  185.     //判断选择的背景图片是否格式正确
  186.     if RightStr( OpenDialog1.FileName , 4 ) = '.bmp' then
  187.     begin
  188.  
  189.       Image1.Picture.LoadFromFile( OpenDialog1.FileName ) ;
  190.  
  191.       //将jpeg图转化为位图
  192.       //jpegImg := TJPEGImage.Create ;
  193.  
  194.       //jpegImg.LoadFromFile( OpenDialog1.FileName ) ;
  195.  
  196.       //bmpBackGround.Assign( jpegImg ) ;
  197.  
  198.       bmpBackGround.Assign(Image1.Picture) ;
  199.  
  200.       isLoadBackGround := True ; 
  201.       
  202.       //设置trackbar2,trackbar3最大值
  203.       trackBar2.Max := bmpBackGround.Width ;
  204.  
  205.       TrackBar3.Max := bmpBackGround.Height ;
  206.  
  207.     end;
  208.  
  209. end;
  210.  
  211.  
  212. //==============================================================================
  213. //打开纹理文件,选择框加载图片
  214. //==============================================================================
  215. procedure TForm1.BitBtn2Click(Sender: TObject);
  216. begin
  217.  
  218.     //打开文件选择框加载图片
  219.     OpenDialog2.Execute;
  220.  
  221.     //判断选择的纹理图片是否格式正确
  222.     if RightStr( OpenDialog2.FileName , 4 ) = '.bmp' then
  223.     begin
  224.     
  225.       Image2.Picture.LoadFromFile( OpenDialog2.FileName ) ;
  226.       
  227.       //将jpeg图转化为位图
  228.       //jpegImg := TJPEGImage.Create ;
  229.  
  230.       //jpegImg.LoadFromFile( OpenDialog2.FileName ) ;
  231.  
  232.       //bmpTexture.Assign( jpegImg ) ;
  233.  
  234.       bmpTexture.Assign(Image2.Picture.Graphic) ;
  235.  
  236.       isLoadTexture := True ;
  237.  
  238.     end;
  239.  
  240. end;
  241.  
  242. //==============================================================================
  243. // trackbar1显示透明度
  244. //==============================================================================
  245. procedure TForm1.TrackBar1Change(Sender: TObject);
  246. begin
  247.  
  248.     alphaValue := TrackBar1.Position ;
  249.  
  250.     Label1.Caption := 'Alpha : ' + IntToStr( alphaValue ) ;
  251.  
  252. end;
  253.  
  254.  
  255. //==============================================================================
  256. // trackbar2显示移动到背景图X位置
  257. //==============================================================================
  258. procedure TForm1.TrackBar2Change(Sender: TObject);
  259. var
  260.   X : Integer ; //X数值
  261.  
  262.   bmpMove : TBitmap ;
  263.  
  264.   rectMove : TRect ;
  265.  
  266. begin 
  267.  
  268.     X :=  trackbar2.Position ;
  269.  
  270.     Label7.Caption := 'X : ' + IntToStr( X ) ;
  271.              
  272.     bmpMove := TBitmap.Create ;
  273.  
  274.     bmpMove.Assign( bmpBackGround );
  275.  
  276.     //产生移动虚线框
  277.     rectMove := Rect(X , trackbar3.Position , X + bmpTexture.Width , trackbar3.Position + bmpTexture.Height ) ;
  278.  
  279.     bmpMove.Canvas.DrawFocusRect( rectMove );
  280.  
  281.     Image1.Canvas.Draw(0,0, bmpMove );
  282.  
  283.     Image1.Refresh;
  284.  
  285. end;
  286.  
  287.  
  288. //==============================================================================
  289. // trackbar3显示移动到背景图Y位置
  290. //==============================================================================
  291. procedure TForm1.TrackBar3Change(Sender: TObject);
  292. var
  293.   Y : Integer ; //Y数值
  294.  
  295.   bmpMove : TBitmap ;
  296.  
  297.   rectMove : TRect ;
  298. begin
  299.  
  300.     Y :=  trackbar3.Position ;
  301.  
  302.     Label8.Caption := 'Y : ' + IntToStr( Y ) ;
  303.  
  304.     bmpMove := TBitmap.Create ;
  305.  
  306.     bmpMove.Assign( bmpBackGround );
  307.  
  308.     //产生移动虚线框
  309.     rectMove := Rect( trackbar2.Position , Y , trackbar2.Position + bmpTexture.Width , Y + bmpTexture.Height ) ;
  310.  
  311.     bmpMove.Canvas.DrawFocusRect( rectMove );
  312.  
  313.     Image1.Canvas.Draw(0,0, bmpMove );
  314.  
  315.     Image1.Refresh;
  316.  
  317. end;
  318.  
  319.  
  320. //==============================================================================
  321. // 移动纹理图至背景图指定位置
  322. //==============================================================================
  323. procedure TForm1.Button2Click(Sender: TObject);
  324. begin
  325.  
  326.   bmpBackGround := BrightnessAndContrast( trackbar5.Position  , trackbar6.Position ) ;
  327.  
  328.   if isLoadTexture = True and isLoadBackGround = True then
  329.       begin
  330.  
  331.           GroupBox1.Caption := '已移动到背景图片' ;
  332.  
  333.           Image1.Picture := nil ; //释放图片
  334.  
  335.           Image1.Canvas.Draw( 0 , 0 , createMoveImg( bmpBackGround , TrackBar2.Position , TrackBar3.Position ) );
  336.  
  337.       end
  338.   else
  339.       begin
  340.  
  341.         ShowMessage( '请先载入纹理图片及背景图片' ) ;
  342.         
  343.       end ;
  344.  
  345. end;
  346.  
  347.  
  348. //==============================================================================
  349. // 处理移动图像
  350. // 参数定义 bmpBackGround1 背景图片
  351. //          bmpTexture1 纹理图片
  352. //          moveX 纹理开始区域在背景图中X坐标
  353. //          moveY 纹理开始区域在背景图中Y坐标
  354. // 返回  Bitmap混合效果特效图片
  355. //==============================================================================
  356. function TForm1.createMoveImg( bmpBackGround1 : TBitmap ; moveX : Integer ; moveY : Integer) : TBitmap;
  357. var
  358.   i : Integer ;
  359.  
  360.   j : Integer ;
  361.  
  362.   pixColorTexture : TColor ;
  363.  
  364.   cr,cg,cb:dword;
  365.  
  366.   bmpResult : TBitmap ; //结果图片
  367.  
  368. begin
  369.  
  370.    bmpResult := TBitmap.Create ;
  371.  
  372.    bmpResult.Assign( bmpBackGround1 ) ;
  373.  
  374.    for i := 0 to  bmpTexture.Width - 1  do
  375.     for j := 0 to  bmpTexture.Height - 1 do
  376.       begin
  377.  
  378.           pixColorTexture := bmpTexture.Canvas.Pixels[ i , j ];
  379.  
  380.           cr := GetRValue(pixColorTexture) ;
  381.  
  382.           cg := GetGValue(pixColorTexture) ;
  383.  
  384.           cb := GetBValue(pixColorTexture) ;
  385.  
  386.           bmpResult.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( cr , cg , cb ) ;
  387.  
  388.       end ;
  389.  
  390.     Result := bmpResult ;
  391.  
  392. end;
  393.  
  394. //==============================================================================
  395. // 处理混合图像
  396. // 参数定义   bmpBackGround1 背景图片
  397. //            bmpTexture1 纹理图片
  398. //            moveX 纹理开始区域在背景图中X坐标
  399. //            moveY 纹理开始区域在背景图中Y坐标
  400. // 返回  Bitmap混合效果特效图片
  401. //==============================================================================
  402. function TForm1.createMixImg( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
  403. var
  404.   pixColorBG : TColor ; //背景图像素RGB值
  405.  
  406.   pixColorTexture : TColor ; //纹理图像素RGB值
  407.  
  408.   bmpResult : TBitmap ; //结果图片
  409.  
  410.   i : Integer ;
  411.  
  412.   j : Integer ;
  413.  
  414.   cr,cg,cb:dword;
  415.  
  416.   R,G,B : dword ;
  417.  
  418. begin
  419.  
  420.     bmpResult := TBitmap.Create ;
  421.  
  422.     bmpResult.Assign( bmpBackGround1 ) ;
  423.  
  424.    //处理纹理alpha透明   ( RGB_Texture * alpha + RGB_Background * (256 - alpha) ) >>8
  425.     For i:=0 to  bmpTexture.Width - 1  do
  426.         For j:=0 to bmpTexture.Height - 1 do
  427.         begin
  428.  
  429.           pixColorTexture := bmpTexture1.Canvas.Pixels[ i , j ];
  430.  
  431.           pixColorBG :=  bmpBackGround1.Canvas.Pixels[ i + moveX , j + moveY ];
  432.  
  433.           R:=( GetRValue(pixColorTexture) * alphaValue + GetRValue(pixColorBG) * (256-alphaValue) ) shr 8;
  434.  
  435.           G:=( GetGValue(pixColorTexture) * alphaValue + GetGValue(pixColorBG) * (256-alphaValue) ) shr 8;
  436.  
  437.           B:=( GetBValue(pixColorTexture) * alphaValue + GetBValue(pixColorBG) * (256-alphaValue) ) shr 8;
  438.  
  439.           bmpResult.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( R , G , B ) ;
  440.  
  441.         end;
  442.  
  443.    //混合算法公式  RGB_Texture * RGB_Background / 255
  444.    for i := 0 to  bmpTexture.Width - 1  do
  445.     for j := 0 to bmpTexture.Height  - 1 do
  446.       begin
  447.  
  448.           pixColorTexture := bmpTexture1.Canvas.Pixels[ i , j ];
  449.  
  450.           pixColorBG :=  bmpBackGround1.Canvas.Pixels[ i + moveX , j + moveY ];
  451.  
  452.           cr :=  ( GetRValue(pixColorBG) * GetRValue(pixColorTexture)  ) div 255 ;
  453.  
  454.           cg :=  ( GetGValue(pixColorBG) * GetGValue(pixColorTexture)  ) div 255 ;
  455.  
  456.           cb :=  ( GetBValue(pixColorBG) * GetBValue(pixColorTexture)  ) div 255 ;
  457.  
  458.           bmpResult.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( cr , cg , cb ) ;
  459.           
  460.       end ;
  461.  
  462.     Result := bmpResult ;
  463.     
  464. end;
  465.  
  466.  
  467. //==============================================================================
  468. // 处理图像置换
  469. // 参数定义   bmpBackGround1 背景图片
  470. //            bmpTexture1 纹理图片
  471. //            moveX 纹理开始区域在背景图中X坐标
  472. //            moveY 纹理开始区域在背景图中Y坐标
  473. // 返回  Bitmap混合置换特效图片
  474. //==============================================================================
  475. function TForm1.replacementEffect( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
  476. var
  477.   pixColorBG : array of array of  TColor ; //背景图像素RGB值
  478.  
  479.   pixColorTexture : array of array of  TColor ; //纹理图像素RGB值
  480.  
  481.   pixColorBGBak : array of array of  TColor ; //背景图备份像素RGB值
  482.  
  483.   pixColorResult : array of array of  TColor ; //混合结果图
  484.  
  485.   bmpBackgroundBak : TBitmap ; //背景图备份
  486.  
  487.   bmpNewTexture : TBitmap ; //扭曲后新纹理图
  488.  
  489.   i : Integer ;
  490.  
  491.   j : Integer ;
  492.  
  493.   bmpWidth : Integer ;
  494.  
  495.   bmpHeight : Integer ;
  496.  
  497.   replaceFactor : Integer ; //置换因子值
  498.  
  499.   cr, cg, cb : array of array of DWORD; //背景像素颜色分量
  500.  
  501.   cgray : array of array of DWORD ; //背景图的灰阶图颜色分量
  502.  
  503.   R, G, B : array of array of DWORD ; //纹理像素颜色分量
  504.  
  505.   crResult, cgResult, cbResult : array of array of DWORD ; //结果图片像素颜色分量
  506.  
  507. begin
  508.  
  509.    SetLength( R ,  bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
  510.  
  511.    SetLength( G ,  bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
  512.  
  513.    SetLength( B ,  bmpTexture1.Width + 128 , bmpTexture1.Height + 128  ) ;
  514.  
  515.    SetLength( cr ,  bmpBackGround1.Width , bmpBackGround1.Height ) ;
  516.  
  517.    SetLength( cg ,  bmpBackGround1.Width , bmpBackGround1.Height ) ;
  518.  
  519.    SetLength( cb ,  bmpBackGround1.Width , bmpBackGround1.Height ) ;
  520.  
  521.    SetLength( crResult , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
  522.  
  523.    SetLength( cgResult , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
  524.  
  525.    SetLength( cbResult , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
  526.  
  527.    SetLength( pixColorBG , bmpBackGround1.Width , bmpBackGround1.Height ) ;
  528.  
  529.    SetLength( pixColorTexture , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
  530.  
  531.    SetLength( pixColorBGBak , bmpBackGround1.Width , bmpBackGround1.Height ) ; //纹理图的灰阶图
  532.  
  533.    SetLength( cgray , bmpBackGround1.Width , bmpBackGround1.Height ) ; //纹理图的灰阶图颜色分量
  534.  
  535.    bmpNewTexture := TBitmap.Create ;
  536.  
  537.    bmpNewTexture.Assign( bmpTexture ) ;
  538.  
  539.    bmpBackgroundBak := TBitmap.Create ;
  540.  
  541.    bmpBackgroundBak.Assign( bmpBackGround1 ) ;
  542.  
  543.    replaceFactor := TrackBar4.Position  ; //置换因子,调整扭曲度用
  544.  
  545.    //纹理区域内背景灰阶图生成
  546.    for i := 1 to bmpTexture.Width  do
  547.     for j := 1 to bmpTexture.Height  do
  548.       begin
  549.  
  550.           pixColorBG[i][j] :=  bmpBackGround1.Canvas.Pixels[ i + moveX , j + moveY ] ;
  551.  
  552.           //获得图像灰阶图
  553.           cr[i][j] := GetRValue( pixColorBG[i][j] ) ;  //背景图红色分量
  554.  
  555.           cg[i][j] := GetGValue( pixColorBG[i][j] ) ;  //背景图绿色分量
  556.  
  557.           cb[i][j] := GetBValue( pixColorBG[i][j] ) ;  //背景图蓝色分量
  558.  
  559.           cgray[i][j] := ( cr[i][j] +  cg[i][j] +  cb[i][j] ) div 3 ;  //获得纹理区域在背景图的灰阶图各个像素的颜色分量 算数平均求灰度
  560.  
  561.           //显示灰度图
  562.           //bmpBackgroundBak.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( cgray[i][j] , cgray[i][j] , cgray[i][j] ) ; //生成背景灰度图
  563.  
  564.       end ;
  565.  
  566.    //纹理图颜色分量
  567.    for i := 1 to bmpTexture1.Width    do
  568.     for j := 1 to bmpTexture1.Height   do
  569.       begin
  570.  
  571.           pixColorTexture[i][j] := bmpTexture1.Canvas.Pixels[ i , j ] ;
  572.  
  573.           R[i][j] := GetRValue( pixColorTexture[i][j] ) ;  //纹理图红色分量
  574.  
  575.           G[i][j] := GetGValue( pixColorTexture[i][j] ) ;  //纹理图绿色分量
  576.  
  577.           B[i][j] := GetBValue( pixColorTexture[i][j] ) ;  //纹理图蓝色分量
  578.  
  579.       end ;
  580.  
  581.    //置换特效图生成  效果图区域 (bmpTexture.Width ) * (bmpTexture.Height )
  582.    for i := 1 to  bmpTexture.Width   do
  583.       for j := 1 to bmpTexture.Height  do
  584.         begin
  585.  
  586.             //***********************************算法说明 **********************************************
  587.             // 左点和上点像素判断情况  , 默认情况下选择做点和上点像素作为判断基准。
  588.             // 如果 目标像素左边一像素的灰度值 > 128 ,则将目标像素向上移动 (目标像素点灰阶值 - 128) * 置换因子 的距离
  589.             // 否则 目标像素左边一像素的灰度值 < 128 ,则将目标像素向下移动 (128 - 目标像素点灰阶值) * 置换因子 的距离
  590.             //*****************************************************************************************
  591.             if (cgray[i - 1][j] > 128and ( j - ( cgray[i][j] - 128 ) * replaceFactor div 100  >= 1 ) then
  592.                begin
  593.  
  594.                     crResult[i][j - ( cgray[i][j] - 128 ) * replaceFactor div 100 ] := R[i][j] ;
  595.  
  596.                     cgResult[i][j - ( cgray[i][j] - 128 ) * replaceFactor div 100 ] := G[i][j] ;
  597.  
  598.                     cbResult[i][j - ( cgray[i][j] - 128 ) * replaceFactor div 100 ] := B[i][j] ;
  599.  
  600.                     crResult[i][j] := R[i][j] ;
  601.  
  602.                     cgResult[i][j] := G[i][j] ;
  603.  
  604.                     cbResult[i][j] := B[i][j] ;
  605.  
  606.                end
  607.             else if (cgray[i - 1][j] < 128and ( j + ( 128 - cgray[i][j] ) * replaceFactor div 100 <= bmpTexture.Height  )  then
  608.                begin
  609.  
  610.                     crResult[i][ j + ( 128 - cgray[i][j] ) * replaceFactor div 100 ] := R[i][j] ;
  611.  
  612.                     cgResult[i][ j + ( 128 - cgray[i][j] ) * replaceFactor div 100 ] := G[i][j] ;
  613.  
  614.                     cbResult[i][ j + ( 128 - cgray[i][j] ) * replaceFactor div 100 ] := B[i][j] ;
  615.  
  616.                     crResult[i][j] := R[i][j] ;
  617.  
  618.                     cgResult[i][j] := G[i][j] ;
  619.  
  620.                     cbResult[i][j] := B[i][j] ;
  621.  
  622.                end ;
  623.             //*************************************************************************************************
  624.             // 如果 目标像素上边一像素的灰度值 > 128 ,则将目标像素向左移动 (目标像素点灰阶值 - 128) * 置换比例 的距离
  625.             // 否则 目标像素上边一像素的灰度值 < 128 ,则将目标像素向右移动 (128 - 目标像素点灰阶值) * 置换比例 的距离
  626.             //*************************************************************************************************
  627.             if ( cgray[i][j - 1] > 128 ) and ( i - ( cgray[i][j] - 128 ) * replaceFactor div 100 >= 1 ) then
  628.                begin
  629.  
  630.                     crResult[i - ( cgray[i][j] - 128 ) * replaceFactor div 100 ][j] := R[i][j] ;
  631.  
  632.                     cgResult[i - ( cgray[i][j] - 128 ) * replaceFactor div 100 ][j] := G[i][j] ;
  633.  
  634.                     cbResult[i - ( cgray[i][j] - 128 ) * replaceFactor div 100 ][j] := B[i][j] ;
  635.  
  636.                     crResult[i][j] := R[i][j] ;
  637.  
  638.                     cgResult[i][j] := G[i][j] ;
  639.  
  640.                     cbResult[i][j] := B[i][j] ;
  641.  
  642.                end
  643.             else if ( cgray[i][j - 1] < 128 ) and ( i + ( 128 - cgray[i][j] ) * replaceFactor div 100 < bmpTexture.Width  ) then
  644.                begin
  645.  
  646.                     crResult[i + ( 128 - cgray[i][j] ) * replaceFactor div 100 ][j] := R[i][j] ;
  647.  
  648.                     cgResult[i + ( 128 - cgray[i][j] ) * replaceFactor div 100 ][j] := G[i][j] ;
  649.  
  650.                     cbResult[i + ( 128 - cgray[i][j] ) * replaceFactor div 100 ][j] := B[i][j] ;
  651.  
  652.                     crResult[i][j] := R[i][j] ;
  653.  
  654.                     cgResult[i][j] := G[i][j] ;
  655.  
  656.                     cbResult[i][j] := B[i][j] ;
  657.  
  658.                end ;
  659.  
  660.             //*************************************************************************************************
  661.             // 右点和下点像素判断情况
  662.             // 如果 目标像素右边一像素的灰度值 > 128 ,则将目标像素向上移动 (目标像素点灰阶值 - 128) * 置换因子 的距离
  663.             // 否则 目标像素右边一像素的灰度值 < 128 ,则将目标像素向下移动 (128 - 目标像素点灰阶值) * 置换因子 的距离
  664.             // 如果 目标像素下边一像素的灰度值 > 128 ,则将目标像素向左移动 (点上的灰阶值 - 128) * 置换比例 的距离
  665.             // 否则 目标像素下边一像素的灰度值 < 128 ,则将目标像素向右移动 (128 - 目标像素点灰阶值) * 置换比例 的距离
  666.             //*************************************************************************************************
  667.  
  668.             //*************************************************************************************************
  669.             // 如果目标像素点上下左右像素灰度都为128 则不发生移动
  670.             //*************************************************************************************************
  671.             if ( cgray[i - 1][j] = 128 ) and ( cgray[i + 1][j] = 128 ) and ( cgray[i][j - 1] = 128 ) and ( cgray[i][j + 1] = 128 ) then
  672.                begin
  673.  
  674.                     crResult[i][j] := R[i][j] ;
  675.  
  676.                     cgResult[i][j] := G[i][j] ;
  677.  
  678.                     cbResult[i][j] := B[i][j] ;
  679.  
  680.                end ;
  681.       end;
  682.  
  683.     //像素绘制图形
  684.     for i := 1 to   bmpTexture.Width   do
  685.       for j := 1 to   bmpTexture.Height   do
  686.         begin
  687.            //消除黑点
  688.            if crResult[i][j] <> clBlack then
  689.              bmpNewTexture.Canvas.Pixels[ i , j ] := RGB( crResult[i][j] , cgResult[i][j] , cbResult[i][j] ) ;
  690.  
  691.         end ;
  692.  
  693.   //混合图形纹理效果
  694.   Result := createMixImg( bmpBackGround1 ,bmpNewTexture,TrackBar2.Position,TrackBar3.Position ) ;
  695.  
  696. end;
  697.  
  698.  
  699. //==============================================================================
  700. //调节背景图亮度对比度
  701. //参数定义    brightness 亮度
  702. //            contrast 对比度
  703. //==============================================================================
  704. function TForm1.BrightnessAndContrast( brightness : Integer ; contrast : Integer ) : TBitmap ;
  705. var
  706.   pixColorBG : TColor ; //背景图像素颜色
  707.  
  708.   bmpBGBak : TBitmap ; //背景图备份
  709.  
  710.   cr, cg, cb : double//背景像素颜色分量
  711.  
  712.   cgray : DWORD ; //背景图的灰阶图颜色分量
  713.  
  714.   R, G, B : double ;
  715.  
  716.   ir, ig, ib : Integer ;
  717.  
  718.   i, j : Integer ;
  719.  
  720. begin
  721.  
  722.   bmpBGBak := TBitmap.Create ;
  723.  
  724.   bmpBGBak.Assign( bmpBackGround );
  725.  
  726.   //算法公式
  727.   for i := 1 to bmpBackGround.Width  do
  728.     for j := 1 to bmpBackGround.Height  do
  729.       begin
  730.  
  731.          pixColorBG :=  bmpBackGround.Canvas.Pixels[i , j] ;
  732.  
  733.          //获得图像RGB分量
  734.          cr := GetRValue( pixColorBG ) ;
  735.  
  736.          cg := GetGValue( pixColorBG ) ;
  737.  
  738.          cb := GetBValue( pixColorBG ) ; 
  739.  
  740.          {
  741.          //黑白2色图, contrast = 0 时 图片只有黑白2色
  742.          cgray := ( cr + cg + cb ) div 3 ;
  743.  
  744.          if cgray > 128 then
  745.             begin
  746.  
  747.                //加亮
  748.                 R := cr * contrast div 100 + brightness ;
  749.  
  750.                 G := cg * contrast div 100 + brightness ;
  751.  
  752.                 B := cb * contrast div 100 + brightness ;
  753.  
  754.             end
  755.  
  756.          else if cgray = 128 then
  757.  
  758.             begin
  759.  
  760.                //不变
  761.                R := cr ;
  762.  
  763.                G := cg ;
  764.  
  765.                B := cb ;
  766.  
  767.             end
  768.  
  769.          else
  770.             begin
  771.  
  772.                //减暗
  773.                R := cr * contrast div 100 - brightness ;
  774.  
  775.                G := cg * contrast div 100 - brightness ;
  776.  
  777.                B := cb * contrast div 100 - brightness ;
  778.  
  779.             end ;}
  780.  
  781.          //背景图RGB分量  调整亮度
  782.          {
  783.          R := cr * contrast div 100 + brightness ;
  784.  
  785.          G := cg * contrast div 100 + brightness ;
  786.  
  787.          B := cb * contrast div 100 + brightness ;
  788.          }
  789.  
  790.          //对比度调整  调节后像素点颜色 = ((RGB / 255.0 - 0.5) * contrast + 0.5) * 255 + brightness;
  791.  
  792.          //处理颜色越界
  793.          R := ( ( cr / 255 - 0.5 ) * contrast + 0.5 ) * 255 + brightness ;
  794.  
  795.          G := ( ( cg / 255 - 0.5 ) * contrast + 0.5 ) * 255 + brightness ;
  796.  
  797.          B := ( ( cb / 255 - 0.5 ) * contrast + 0.5 ) * 255 + brightness ;
  798.  
  799.          //if pixColorBG > 255 then pixColorBG := 255 else if pixColorBG < 0 then pixColorBG :=0 ;
  800.  
  801.          if R > 255 then R := 255 else if R < 0 then R :=0 ;
  802.  
  803.          if G > 255 then G := 255 else if G < 0 then G :=0 ;
  804.  
  805.          if B > 255 then B := 255 else if B < 0 then B :=0 ;
  806.  
  807.          bmpBGBak.Canvas.Pixels[i,j] := RGB( Round(R), Round(G), Round(B) ) ;
  808.  
  809.       end ;
  810.  
  811.       Image1.Picture.Assign( bmpBGBak ) ;
  812.  
  813.       Result :=  bmpBGBak ;
  814.  
  815. end;
  816.  
  817.  
  818. //==============================================================================
  819. // 置换按钮
  820. //==============================================================================
  821. procedure TForm1.Button1Click(Sender: TObject);
  822. begin
  823.  
  824.    if isLoadTexture = True and isLoadBackGround = True then
  825.       begin
  826.  
  827.           GroupBox1.Caption := '置换特效图片' ;
  828.  
  829.           Image1.Picture := nil ; //释放图片
  830.  
  831.           Image1.Canvas.Draw( 0 , 0 , replacementEffect( BrightnessAndContrast( trackbar5.Position  , trackbar6.Position ) ,bmpTexture , TrackBar2.Position , TrackBar3.Position ) );
  832.  
  833.       end
  834.   else
  835.       begin
  836.  
  837.           ShowMessage( '请先载入纹理图片及背景图片' ) ;
  838.  
  839.       end ;
  840.  
  841. end;
  842.  
  843.  
  844. //==============================================================================
  845. // 置换因子调整
  846. //==============================================================================
  847. procedure TForm1.TrackBar4Change(Sender: TObject);
  848. begin
  849.  
  850.     Label4.Caption := 'Replace Factor : ' + IntToStr( TrackBar4.Position );
  851.  
  852. end;
  853.  
  854.  
  855. //==============================================================================
  856. // 亮度因子调整
  857. //==============================================================================
  858. procedure TForm1.TrackBar5Change(Sender: TObject);
  859. begin
  860.  
  861.     //BrightnessAndContrast( 0 , 105 ) ;
  862.  
  863.     label5.Caption := 'Brightness :' + InttoStr( trackbar5.Position ) ;
  864.  
  865. end;
  866.  
  867.  
  868. //==============================================================================
  869. // 对比度因子调整按钮
  870. //==============================================================================
  871. procedure TForm1.TrackBar6Change(Sender: TObject);
  872. begin
  873.  
  874.     //BrightnessAndContrast( 0 , 105 ) ;
  875.  
  876.     label6.Caption := 'Contrast :' + InttoStr( trackbar6.Position ) ;
  877.  
  878. end;
  879.  
  880.  
  881. //==============================================================================
  882. // 确认亮度对比度按钮
  883. //==============================================================================
  884. procedure TForm1.Button3Click(Sender: TObject);
  885. begin
  886.  
  887.    BrightnessAndContrast( trackbar5.Position  , trackbar6.Position ) ;
  888.  
  889. end;
  890.  
  891. end.
  892.  

效果图

1.原背景

 

 

 

 

2

 

 

 

2。原纹理

 

 

 

 

 

 

 

3.合成效果1

 

 

 

 

 

 

4.合成效果2

 

 

« 上一篇 | 下一篇 »