本文主要是介绍原创 ···DELPHI 图片图形图像处理 PS置换滤镜效果,亮度/对比度,纹理贴图效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
DELPHI 图片图形图像处理 PS置换滤镜效果,亮度/对比度,纹理贴图
以前没弄过DELPHI,最近学了1个多星期时间,无聊时候吧以前用C#写的部分图像处理代码转换成DELPHI,竟然发现D处理图片的速度比C#快了20倍··················D处理图片0.3s,C#处理同一图片6s多 ,差距真大·····················我写的算法调用GDI函数,无汇编便于理解,觉的好的顶一个,顶的多就发布下一篇图像处理,转帖的话请写明转帖和原作者 胡睿 QQ 235483710 EMAIL: jennievictor@163.com
欢迎大家交流技术。D没学多久,有些地方没写好的别见怪,有优化的大家优化吧,把成果共享下。
www.googler.cc/software.html 下载
http://www.googler.cc/ps.html 可以购买该软件完整源码
- //==============================================================================
- // 图像处理程序 , 纹理与背景融合算法 未优化版
- // 作者 : 胡睿 QQ :235483710, Email :jennievictor@163.com
- // 创建日期 : 2008/9/2
- // 承接手机程序开发,windows程序开发,图形图像处理开发,数据库开发等外包业务
- // 主打 .net, SqlServer 2K , Oracle , J2me , WM
- //==============================================================================
- unit Main;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, jpeg, StrUtils, FmtBcd ;
- type
- TForm1 = class(TForm)
- BitBtn1: TBitBtn;
- BitBtn2: TBitBtn;
- OpenDialog1: TOpenDialog;
- OpenDialog2: TOpenDialog;
- GroupBox1: TGroupBox;
- Image1: TImage;
- GroupBox2: TGroupBox;
- Image2: TImage;
- BitBtn3: TBitBtn;
- TrackBar1: TTrackBar;
- Button2: TButton;
- Label7: TLabel;
- Label8: TLabel;
- Label1: TLabel;
- TrackBar2: TTrackBar;
- TrackBar3: TTrackBar;
- Label2: TLabel;
- Button1: TButton;
- Label3: TLabel;
- TrackBar4: TTrackBar;
- Label4: TLabel;
- TrackBar5: TTrackBar;
- TrackBar6: TTrackBar;
- Label5: TLabel;
- Label6: TLabel;
- Button3: TButton;
- Label9: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure BitBtn3Click(Sender: TObject);
- procedure BitBtn1Click(Sender: TObject);
- procedure BitBtn2Click(Sender: TObject);
- procedure TrackBar1Change(Sender: TObject);
- procedure TrackBar2Change(Sender: TObject);
- procedure TrackBar3Change(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- // 处理移动图像
- // 参数定义 bmpBackGround1 背景图片
- // bmpTexture1 纹理图片
- // moveX 纹理开始区域在背景图中X坐标
- // moveY 纹理开始区域在背景图中Y坐标
- // 返回 Bitmap移动后的图片
- function createMoveImg( bmpBackGround1 : TBitmap ; moveX : Integer ; moveY : Integer) : TBitmap;
- // 处理混合图像
- // 参数定义 bmpBackGround1 背景图片
- // bmpTexture1 纹理图片
- // moveX 纹理开始区域在背景图中X坐标
- // moveY 纹理开始区域在背景图中Y坐标
- // 返回 Bitmap混合效果特效图片
- function createMixImg( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
- // 处理图像置换
- // 参数定义 bmpBackGround1 背景图片
- // bmpTexture1 纹理图片
- // moveX 纹理开始区域在背景图中X坐标
- // moveY 纹理开始区域在背景图中Y坐标
- // 返回 Bitmap混合置换特效图片
- function replacementEffect( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
- //调节背景图亮度对比度
- //参数定义 brightness 亮度
- // contrast 对比度
- function BrightnessAndContrast( brightness : Integer ; contrast : Integer ) : TBitmap ;
- procedure Button1Click(Sender: TObject);
- procedure TrackBar4Change(Sender: TObject);
- procedure TrackBar5Change(Sender: TObject);
- procedure TrackBar6Change(Sender: TObject);
- procedure Button3Click(Sender: TObject);
- private
- { Private declarations }
- { procedure BlendBmp(Bmp : TBitmap; BlendValue: Byte);//透明度处理 }
- public
- { Public declarations }
- end;
- var
- Form1 : TForm1 ;
- bmpBackGround : TBitmap ; //背景位图
- bmpTexture : TBitmap ; //纹理位图
- isLoadBackGround : Boolean ; //是否已经加载背景图
- isLoadTexture : Boolean ; //是否已经加载纹理图
- alphaValue : Integer ; //alpha数值
- implementation
- {$R *.dfm}
- //==============================================================================
- // 图像处理程序 , 纹理与背景融合算法 未优化版
- // 作者 : 胡睿 QQ :235483710, Email :jennievictor@163.com
- // 创建日期 : 2008/9/2
- // 承接手机程序开发,windows程序开发,图形图像处理开发,数据库开发等外包业务
- // 主打 .net, SqlServer 2K , Oracle , J2me , WM
- //==============================================================================
- //==============================================================================
- // 窗体初始化
- //==============================================================================
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- //窗体初始化位置
- OpenDialog1.Title := '请选择图片文件,Demo仅支持bmp' ;
- OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName) ;
- OpenDialog2.Title := '请选择图片文件,Demo仅支持bmp' ;
- OpenDialog2.InitialDir := ExtractFilePath(Application.ExeName) ;
- Form1.Top := -20 ;
- Form1.Left := 11 ;
- //初始化位图
- bmpBackGround := TBitmap.Create ; //背景位图
- bmpTexture := TBitmap.Create ; //纹理位图
- self.DoubleBuffered := true ; //打开双缓冲
- end;
- //==============================================================================
- // 混合溶解,产生特效图片
- //==============================================================================
- procedure TForm1.BitBtn3Click(Sender: TObject);
- begin
- GroupBox1.Caption := '特效图片' ;
- if isLoadTexture = True and isLoadBackGround = True then
- begin
- Image1.Picture := nil ; //释放图片
- Image1.Canvas.Draw( 0 , 0 , createMixImg( bmpBackGround ,bmpTexture , TrackBar2.Position , TrackBar3.Position ) );
- Image1.Canvas.TextOut( 60,60,'DEMO 胡睿制作 QQ : 235483710 ' );
- end
- else
- begin
- ShowMessage( '请先载入纹理图片及背景图片' ) ;
- end;
- end;
- //==============================================================================
- //打开背景文件,选择框加载图片
- //==============================================================================
- procedure TForm1.BitBtn1Click(Sender: TObject);
- begin
- //打开文件选择框加载图片
- OpenDialog1.Execute ;
- //判断选择的背景图片是否格式正确
- if RightStr( OpenDialog1.FileName , 4 ) = '.bmp' then
- begin
- Image1.Picture.LoadFromFile( OpenDialog1.FileName ) ;
- //将jpeg图转化为位图
- //jpegImg := TJPEGImage.Create ;
- //jpegImg.LoadFromFile( OpenDialog1.FileName ) ;
- //bmpBackGround.Assign( jpegImg ) ;
- bmpBackGround.Assign(Image1.Picture) ;
- isLoadBackGround := True ;
- //设置trackbar2,trackbar3最大值
- trackBar2.Max := bmpBackGround.Width ;
- TrackBar3.Max := bmpBackGround.Height ;
- end;
- end;
- //==============================================================================
- //打开纹理文件,选择框加载图片
- //==============================================================================
- procedure TForm1.BitBtn2Click(Sender: TObject);
- begin
- //打开文件选择框加载图片
- OpenDialog2.Execute;
- //判断选择的纹理图片是否格式正确
- if RightStr( OpenDialog2.FileName , 4 ) = '.bmp' then
- begin
- Image2.Picture.LoadFromFile( OpenDialog2.FileName ) ;
- //将jpeg图转化为位图
- //jpegImg := TJPEGImage.Create ;
- //jpegImg.LoadFromFile( OpenDialog2.FileName ) ;
- //bmpTexture.Assign( jpegImg ) ;
- bmpTexture.Assign(Image2.Picture.Graphic) ;
- isLoadTexture := True ;
- end;
- end;
- //==============================================================================
- // trackbar1显示透明度
- //==============================================================================
- procedure TForm1.TrackBar1Change(Sender: TObject);
- begin
- alphaValue := TrackBar1.Position ;
- Label1.Caption := 'Alpha : ' + IntToStr( alphaValue ) ;
- end;
- //==============================================================================
- // trackbar2显示移动到背景图X位置
- //==============================================================================
- procedure TForm1.TrackBar2Change(Sender: TObject);
- var
- X : Integer ; //X数值
- bmpMove : TBitmap ;
- rectMove : TRect ;
- begin
- X := trackbar2.Position ;
- Label7.Caption := 'X : ' + IntToStr( X ) ;
- bmpMove := TBitmap.Create ;
- bmpMove.Assign( bmpBackGround );
- //产生移动虚线框
- rectMove := Rect(X , trackbar3.Position , X + bmpTexture.Width , trackbar3.Position + bmpTexture.Height ) ;
- bmpMove.Canvas.DrawFocusRect( rectMove );
- Image1.Canvas.Draw(0,0, bmpMove );
- Image1.Refresh;
- end;
- //==============================================================================
- // trackbar3显示移动到背景图Y位置
- //==============================================================================
- procedure TForm1.TrackBar3Change(Sender: TObject);
- var
- Y : Integer ; //Y数值
- bmpMove : TBitmap ;
- rectMove : TRect ;
- begin
- Y := trackbar3.Position ;
- Label8.Caption := 'Y : ' + IntToStr( Y ) ;
- bmpMove := TBitmap.Create ;
- bmpMove.Assign( bmpBackGround );
- //产生移动虚线框
- rectMove := Rect( trackbar2.Position , Y , trackbar2.Position + bmpTexture.Width , Y + bmpTexture.Height ) ;
- bmpMove.Canvas.DrawFocusRect( rectMove );
- Image1.Canvas.Draw(0,0, bmpMove );
- Image1.Refresh;
- end;
- //==============================================================================
- // 移动纹理图至背景图指定位置
- //==============================================================================
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- bmpBackGround := BrightnessAndContrast( trackbar5.Position , trackbar6.Position ) ;
- if isLoadTexture = True and isLoadBackGround = True then
- begin
- GroupBox1.Caption := '已移动到背景图片' ;
- Image1.Picture := nil ; //释放图片
- Image1.Canvas.Draw( 0 , 0 , createMoveImg( bmpBackGround , TrackBar2.Position , TrackBar3.Position ) );
- end
- else
- begin
- ShowMessage( '请先载入纹理图片及背景图片' ) ;
- end ;
- end;
- //==============================================================================
- // 处理移动图像
- // 参数定义 bmpBackGround1 背景图片
- // bmpTexture1 纹理图片
- // moveX 纹理开始区域在背景图中X坐标
- // moveY 纹理开始区域在背景图中Y坐标
- // 返回 Bitmap混合效果特效图片
- //==============================================================================
- function TForm1.createMoveImg( bmpBackGround1 : TBitmap ; moveX : Integer ; moveY : Integer) : TBitmap;
- var
- i : Integer ;
- j : Integer ;
- pixColorTexture : TColor ;
- cr,cg,cb:dword;
- bmpResult : TBitmap ; //结果图片
- begin
- bmpResult := TBitmap.Create ;
- bmpResult.Assign( bmpBackGround1 ) ;
- for i := 0 to bmpTexture.Width - 1 do
- for j := 0 to bmpTexture.Height - 1 do
- begin
- pixColorTexture := bmpTexture.Canvas.Pixels[ i , j ];
- cr := GetRValue(pixColorTexture) ;
- cg := GetGValue(pixColorTexture) ;
- cb := GetBValue(pixColorTexture) ;
- bmpResult.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( cr , cg , cb ) ;
- end ;
- Result := bmpResult ;
- end;
- //==============================================================================
- // 处理混合图像
- // 参数定义 bmpBackGround1 背景图片
- // bmpTexture1 纹理图片
- // moveX 纹理开始区域在背景图中X坐标
- // moveY 纹理开始区域在背景图中Y坐标
- // 返回 Bitmap混合效果特效图片
- //==============================================================================
- function TForm1.createMixImg( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
- var
- pixColorBG : TColor ; //背景图像素RGB值
- pixColorTexture : TColor ; //纹理图像素RGB值
- bmpResult : TBitmap ; //结果图片
- i : Integer ;
- j : Integer ;
- cr,cg,cb:dword;
- R,G,B : dword ;
- begin
- bmpResult := TBitmap.Create ;
- bmpResult.Assign( bmpBackGround1 ) ;
- //处理纹理alpha透明 ( RGB_Texture * alpha + RGB_Background * (256 - alpha) ) >>8
- For i:=0 to bmpTexture.Width - 1 do
- For j:=0 to bmpTexture.Height - 1 do
- begin
- pixColorTexture := bmpTexture1.Canvas.Pixels[ i , j ];
- pixColorBG := bmpBackGround1.Canvas.Pixels[ i + moveX , j + moveY ];
- R:=( GetRValue(pixColorTexture) * alphaValue + GetRValue(pixColorBG) * (256-alphaValue) ) shr 8;
- G:=( GetGValue(pixColorTexture) * alphaValue + GetGValue(pixColorBG) * (256-alphaValue) ) shr 8;
- B:=( GetBValue(pixColorTexture) * alphaValue + GetBValue(pixColorBG) * (256-alphaValue) ) shr 8;
- bmpResult.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( R , G , B ) ;
- end;
- //混合算法公式 RGB_Texture * RGB_Background / 255
- for i := 0 to bmpTexture.Width - 1 do
- for j := 0 to bmpTexture.Height - 1 do
- begin
- pixColorTexture := bmpTexture1.Canvas.Pixels[ i , j ];
- pixColorBG := bmpBackGround1.Canvas.Pixels[ i + moveX , j + moveY ];
- cr := ( GetRValue(pixColorBG) * GetRValue(pixColorTexture) ) div 255 ;
- cg := ( GetGValue(pixColorBG) * GetGValue(pixColorTexture) ) div 255 ;
- cb := ( GetBValue(pixColorBG) * GetBValue(pixColorTexture) ) div 255 ;
- bmpResult.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( cr , cg , cb ) ;
- end ;
- Result := bmpResult ;
- end;
- //==============================================================================
- // 处理图像置换
- // 参数定义 bmpBackGround1 背景图片
- // bmpTexture1 纹理图片
- // moveX 纹理开始区域在背景图中X坐标
- // moveY 纹理开始区域在背景图中Y坐标
- // 返回 Bitmap混合置换特效图片
- //==============================================================================
- function TForm1.replacementEffect( bmpBackGround1 : TBitmap ; bmpTexture1 : TBitmap ; moveX : Integer ; moveY : Integer ) : TBitmap ;
- var
- pixColorBG : array of array of TColor ; //背景图像素RGB值
- pixColorTexture : array of array of TColor ; //纹理图像素RGB值
- pixColorBGBak : array of array of TColor ; //背景图备份像素RGB值
- pixColorResult : array of array of TColor ; //混合结果图
- bmpBackgroundBak : TBitmap ; //背景图备份
- bmpNewTexture : TBitmap ; //扭曲后新纹理图
- i : Integer ;
- j : Integer ;
- bmpWidth : Integer ;
- bmpHeight : Integer ;
- replaceFactor : Integer ; //置换因子值
- cr, cg, cb : array of array of DWORD; //背景像素颜色分量
- cgray : array of array of DWORD ; //背景图的灰阶图颜色分量
- R, G, B : array of array of DWORD ; //纹理像素颜色分量
- crResult, cgResult, cbResult : array of array of DWORD ; //结果图片像素颜色分量
- begin
- SetLength( R , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
- SetLength( G , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
- SetLength( B , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
- SetLength( cr , bmpBackGround1.Width , bmpBackGround1.Height ) ;
- SetLength( cg , bmpBackGround1.Width , bmpBackGround1.Height ) ;
- SetLength( cb , bmpBackGround1.Width , bmpBackGround1.Height ) ;
- SetLength( crResult , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
- SetLength( cgResult , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
- SetLength( cbResult , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
- SetLength( pixColorBG , bmpBackGround1.Width , bmpBackGround1.Height ) ;
- SetLength( pixColorTexture , bmpTexture1.Width + 128 , bmpTexture1.Height + 128 ) ;
- SetLength( pixColorBGBak , bmpBackGround1.Width , bmpBackGround1.Height ) ; //纹理图的灰阶图
- SetLength( cgray , bmpBackGround1.Width , bmpBackGround1.Height ) ; //纹理图的灰阶图颜色分量
- bmpNewTexture := TBitmap.Create ;
- bmpNewTexture.Assign( bmpTexture ) ;
- bmpBackgroundBak := TBitmap.Create ;
- bmpBackgroundBak.Assign( bmpBackGround1 ) ;
- replaceFactor := TrackBar4.Position ; //置换因子,调整扭曲度用
- //纹理区域内背景灰阶图生成
- for i := 1 to bmpTexture.Width do
- for j := 1 to bmpTexture.Height do
- begin
- pixColorBG[i][j] := bmpBackGround1.Canvas.Pixels[ i + moveX , j + moveY ] ;
- //获得图像灰阶图
- cr[i][j] := GetRValue( pixColorBG[i][j] ) ; //背景图红色分量
- cg[i][j] := GetGValue( pixColorBG[i][j] ) ; //背景图绿色分量
- cb[i][j] := GetBValue( pixColorBG[i][j] ) ; //背景图蓝色分量
- cgray[i][j] := ( cr[i][j] + cg[i][j] + cb[i][j] ) div 3 ; //获得纹理区域在背景图的灰阶图各个像素的颜色分量 算数平均求灰度
- //显示灰度图
- //bmpBackgroundBak.Canvas.Pixels[ i + moveX , j + moveY ] := RGB( cgray[i][j] , cgray[i][j] , cgray[i][j] ) ; //生成背景灰度图
- end ;
- //纹理图颜色分量
- for i := 1 to bmpTexture1.Width do
- for j := 1 to bmpTexture1.Height do
- begin
- pixColorTexture[i][j] := bmpTexture1.Canvas.Pixels[ i , j ] ;
- R[i][j] := GetRValue( pixColorTexture[i][j] ) ; //纹理图红色分量
- G[i][j] := GetGValue( pixColorTexture[i][j] ) ; //纹理图绿色分量
- B[i][j] := GetBValue( pixColorTexture[i][j] ) ; //纹理图蓝色分量
- end ;
- //置换特效图生成 效果图区域 (bmpTexture.Width ) * (bmpTexture.Height )
- for i := 1 to bmpTexture.Width do
- for j := 1 to bmpTexture.Height do
- begin
- //***********************************算法说明 **********************************************
- // 左点和上点像素判断情况 , 默认情况下选择做点和上点像素作为判断基准。
- // 如果 目标像素左边一像素的灰度值 > 128 ,则将目标像素向上移动 (目标像素点灰阶值 - 128) * 置换因子 的距离
- // 否则 目标像素左边一像素的灰度值 < 128 ,则将目标像素向下移动 (128 - 目标像素点灰阶值) * 置换因子 的距离
- //*****************************************************************************************
- if (cgray[i - 1][j] > 128) and ( j - ( cgray[i][j] - 128 ) * replaceFactor div 100 >= 1 ) then
- begin
- crResult[i][j - ( cgray[i][j] - 128 ) * replaceFactor div 100 ] := R[i][j] ;
- cgResult[i][j - ( cgray[i][j] - 128 ) * replaceFactor div 100 ] := G[i][j] ;
- cbResult[i][j - ( cgray[i][j] - 128 ) * replaceFactor div 100 ] := B[i][j] ;
- crResult[i][j] := R[i][j] ;
- cgResult[i][j] := G[i][j] ;
- cbResult[i][j] := B[i][j] ;
- end
- else if (cgray[i - 1][j] < 128) and ( j + ( 128 - cgray[i][j] ) * replaceFactor div 100 <= bmpTexture.Height ) then
- begin
- crResult[i][ j + ( 128 - cgray[i][j] ) * replaceFactor div 100 ] := R[i][j] ;
- cgResult[i][ j + ( 128 - cgray[i][j] ) * replaceFactor div 100 ] := G[i][j] ;
- cbResult[i][ j + ( 128 - cgray[i][j] ) * replaceFactor div 100 ] := B[i][j] ;
- crResult[i][j] := R[i][j] ;
- cgResult[i][j] := G[i][j] ;
- cbResult[i][j] := B[i][j] ;
- end ;
- //*************************************************************************************************
- // 如果 目标像素上边一像素的灰度值 > 128 ,则将目标像素向左移动 (目标像素点灰阶值 - 128) * 置换比例 的距离
- // 否则 目标像素上边一像素的灰度值 < 128 ,则将目标像素向右移动 (128 - 目标像素点灰阶值) * 置换比例 的距离
- //*************************************************************************************************
- if ( cgray[i][j - 1] > 128 ) and ( i - ( cgray[i][j] - 128 ) * replaceFactor div 100 >= 1 ) then
- begin
- crResult[i - ( cgray[i][j] - 128 ) * replaceFactor div 100 ][j] := R[i][j] ;
- cgResult[i - ( cgray[i][j] - 128 ) * replaceFactor div 100 ][j] := G[i][j] ;
- cbResult[i - ( cgray[i][j] - 128 ) * replaceFactor div 100 ][j] := B[i][j] ;
- crResult[i][j] := R[i][j] ;
- cgResult[i][j] := G[i][j] ;
- cbResult[i][j] := B[i][j] ;
- end
- else if ( cgray[i][j - 1] < 128 ) and ( i + ( 128 - cgray[i][j] ) * replaceFactor div 100 < bmpTexture.Width ) then
- begin
- crResult[i + ( 128 - cgray[i][j] ) * replaceFactor div 100 ][j] := R[i][j] ;
- cgResult[i + ( 128 - cgray[i][j] ) * replaceFactor div 100 ][j] := G[i][j] ;
- cbResult[i + ( 128 - cgray[i][j] ) * replaceFactor div 100 ][j] := B[i][j] ;
- crResult[i][j] := R[i][j] ;
- cgResult[i][j] := G[i][j] ;
- cbResult[i][j] := B[i][j] ;
- end ;
- //*************************************************************************************************
- // 右点和下点像素判断情况
- // 如果 目标像素右边一像素的灰度值 > 128 ,则将目标像素向上移动 (目标像素点灰阶值 - 128) * 置换因子 的距离
- // 否则 目标像素右边一像素的灰度值 < 128 ,则将目标像素向下移动 (128 - 目标像素点灰阶值) * 置换因子 的距离
- // 如果 目标像素下边一像素的灰度值 > 128 ,则将目标像素向左移动 (点上的灰阶值 - 128) * 置换比例 的距离
- // 否则 目标像素下边一像素的灰度值 < 128 ,则将目标像素向右移动 (128 - 目标像素点灰阶值) * 置换比例 的距离
- //*************************************************************************************************
- //*************************************************************************************************
- // 如果目标像素点上下左右像素灰度都为128 则不发生移动
- //*************************************************************************************************
- 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
- begin
- crResult[i][j] := R[i][j] ;
- cgResult[i][j] := G[i][j] ;
- cbResult[i][j] := B[i][j] ;
- end ;
- end;
- //像素绘制图形
- for i := 1 to bmpTexture.Width do
- for j := 1 to bmpTexture.Height do
- begin
- //消除黑点
- if crResult[i][j] <> clBlack then
- bmpNewTexture.Canvas.Pixels[ i , j ] := RGB( crResult[i][j] , cgResult[i][j] , cbResult[i][j] ) ;
- end ;
- //混合图形纹理效果
- Result := createMixImg( bmpBackGround1 ,bmpNewTexture,TrackBar2.Position,TrackBar3.Position ) ;
- end;
- //==============================================================================
- //调节背景图亮度对比度
- //参数定义 brightness 亮度
- // contrast 对比度
- //==============================================================================
- function TForm1.BrightnessAndContrast( brightness : Integer ; contrast : Integer ) : TBitmap ;
- var
- pixColorBG : TColor ; //背景图像素颜色
- bmpBGBak : TBitmap ; //背景图备份
- cr, cg, cb : double; //背景像素颜色分量
- cgray : DWORD ; //背景图的灰阶图颜色分量
- R, G, B : double ;
- ir, ig, ib : Integer ;
- i, j : Integer ;
- begin
- bmpBGBak := TBitmap.Create ;
- bmpBGBak.Assign( bmpBackGround );
- //算法公式
- for i := 1 to bmpBackGround.Width do
- for j := 1 to bmpBackGround.Height do
- begin
- pixColorBG := bmpBackGround.Canvas.Pixels[i , j] ;
- //获得图像RGB分量
- cr := GetRValue( pixColorBG ) ;
- cg := GetGValue( pixColorBG ) ;
- cb := GetBValue( pixColorBG ) ;
- {
- //黑白2色图, contrast = 0 时 图片只有黑白2色
- cgray := ( cr + cg + cb ) div 3 ;
- if cgray > 128 then
- begin
- //加亮
- R := cr * contrast div 100 + brightness ;
- G := cg * contrast div 100 + brightness ;
- B := cb * contrast div 100 + brightness ;
- end
- else if cgray = 128 then
- begin
- //不变
- R := cr ;
- G := cg ;
- B := cb ;
- end
- else
- begin
- //减暗
- R := cr * contrast div 100 - brightness ;
- G := cg * contrast div 100 - brightness ;
- B := cb * contrast div 100 - brightness ;
- end ;}
- //背景图RGB分量 调整亮度
- {
- R := cr * contrast div 100 + brightness ;
- G := cg * contrast div 100 + brightness ;
- B := cb * contrast div 100 + brightness ;
- }
- //对比度调整 调节后像素点颜色 = ((RGB / 255.0 - 0.5) * contrast + 0.5) * 255 + brightness;
- //处理颜色越界
- R := ( ( cr / 255 - 0.5 ) * contrast + 0.5 ) * 255 + brightness ;
- G := ( ( cg / 255 - 0.5 ) * contrast + 0.5 ) * 255 + brightness ;
- B := ( ( cb / 255 - 0.5 ) * contrast + 0.5 ) * 255 + brightness ;
- //if pixColorBG > 255 then pixColorBG := 255 else if pixColorBG < 0 then pixColorBG :=0 ;
- if R > 255 then R := 255 else if R < 0 then R :=0 ;
- if G > 255 then G := 255 else if G < 0 then G :=0 ;
- if B > 255 then B := 255 else if B < 0 then B :=0 ;
- bmpBGBak.Canvas.Pixels[i,j] := RGB( Round(R), Round(G), Round(B) ) ;
- end ;
- Image1.Picture.Assign( bmpBGBak ) ;
- Result := bmpBGBak ;
- end;
- //==============================================================================
- // 置换按钮
- //==============================================================================
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- if isLoadTexture = True and isLoadBackGround = True then
- begin
- GroupBox1.Caption := '置换特效图片' ;
- Image1.Picture := nil ; //释放图片
- Image1.Canvas.Draw( 0 , 0 , replacementEffect( BrightnessAndContrast( trackbar5.Position , trackbar6.Position ) ,bmpTexture , TrackBar2.Position , TrackBar3.Position ) );
- end
- else
- begin
- ShowMessage( '请先载入纹理图片及背景图片' ) ;
- end ;
- end;
- //==============================================================================
- // 置换因子调整
- //==============================================================================
- procedure TForm1.TrackBar4Change(Sender: TObject);
- begin
- Label4.Caption := 'Replace Factor : ' + IntToStr( TrackBar4.Position );
- end;
- //==============================================================================
- // 亮度因子调整
- //==============================================================================
- procedure TForm1.TrackBar5Change(Sender: TObject);
- begin
- //BrightnessAndContrast( 0 , 105 ) ;
- label5.Caption := 'Brightness :' + InttoStr( trackbar5.Position ) ;
- end;
- //==============================================================================
- // 对比度因子调整按钮
- //==============================================================================
- procedure TForm1.TrackBar6Change(Sender: TObject);
- begin
- //BrightnessAndContrast( 0 , 105 ) ;
- label6.Caption := 'Contrast :' + InttoStr( trackbar6.Position ) ;
- end;
- //==============================================================================
- // 确认亮度对比度按钮
- //==============================================================================
- procedure TForm1.Button3Click(Sender: TObject);
- begin
- BrightnessAndContrast( trackbar5.Position , trackbar6.Position ) ;
- end;
- end.
效果图
1.原背景
2
2。原纹理
3.合成效果1
4.合成效果2
界面代码:
- object Form1: TForm1
- Left = 168
- Top = 177
- Width = 1000
- Height = 721
- Caption = #22270#20687#22788#29702','#32993#30591#21046#20316'DEMO'#65292'QQ'#65306'235483710'
- Color = clBtnFace
- Font.Charset = DEFAULT_CHARSET
- Font.Color = clWindowText
- Font.Height = -11
- Font.Name = 'MS Sans Serif'
- Font.Style = []
- OldCreateOrder = False
- Position = poMainFormCenter
- OnCreate = FormCreate
- PixelsPerInch = 96
- TextHeight = 13
- object Label7: TLabel
- Left = 672
- Top = 600
- Width = 7
- Height = 13
- Caption = 'X'
- end
- object Label8: TLabel
- Left = 672
- Top = 624
- Width = 7
- Height = 13
- Caption = 'Y'
- end
- object Label1: TLabel
- Left = 632
- Top = 552
- Width = 27
- Height = 13
- Caption = 'Alpha'
- end
- object Label2: TLabel
- Left = 480
- Top = 656
- Width = 33
- Height = 13
- Caption = '<<<-----'
- end
- object Label3: TLabel
- Left = 480
- Top = 624
- Width = 33
- Height = 13
- Caption = '<<<-----'
- end
- object Label4: TLabel
- Left = 721
- Top = 672
- Width = 73
- Height = 13
- Caption = 'Replace Factor'
- end
- object Label5: TLabel
- Left = 16
- Top = 616
- Width = 49
- Height = 13
- Caption = 'Brightness'
- end
- object Label6: TLabel
- Left = 16
- Top = 648
- Width = 39
- Height = 13
- Caption = 'Contrast'
- end
- object Label9: TLabel
- Left = 224
- Top = 624
- Width = 32
- Height = 13
- Caption = 'Label9'
- end
- object BitBtn1: TBitBtn
- Left = 16
- Top = 16
- Width = 89
- Height = 25
- Caption = #23548#20837#32972#26223#22270#29255
- TabOrder = 0
- OnClick = BitBtn1Click
- end
- object BitBtn2: TBitBtn
- Left = 520
- Top = 16
- Width = 89
- Height = 25
- Caption = #23548#20837#32441#29702#22270#29255
- TabOrder = 1
- OnClick = BitBtn2Click
- end
- object GroupBox1: TGroupBox
- Left = 16
- Top = 48
- Width = 457
- Height = 553
- Caption = #32972#26223#22270#29255
- TabOrder = 2
- object Image1: TImage
- Left = 8
- Top = 16
- Width = 441
- Height = 513
- AutoSize = True
- Center = True
- end
- end
- object GroupBox2: TGroupBox
- Left = 520
- Top = 48
- Width = 457
- Height = 489
- Caption = #32441#29702#22270#29255
- TabOrder = 3
- object Image2: TImage
- Left = 8
- Top = 16
- Width = 441
- Height = 449
- Center = True
- end
- end
- object BitBtn3: TBitBtn
- Left = 520
- Top = 616
- Width = 129
- Height = 28
- Caption = #28151#21512#28342#35299
- TabOrder = 4
- OnClick = BitBtn3Click
- end
- object TrackBar1: TTrackBar
- Left = 712
- Top = 552
- Width = 257
- Height = 33
- Ctl3D = True
- Max = 255
- ParentCtl3D = False
- Frequency = 55
- Position = 125
- TabOrder = 5
- OnChange = TrackBar1Change
- end
- object Button2: TButton
- Left = 520
- Top = 584
- Width = 129
- Height = 28
- Caption = #31227#21160#21040#32972#26223#22352#26631
- TabOrder = 6
- OnClick = Button2Click
- end
- object TrackBar2: TTrackBar
- Left = 712
- Top = 584
- Width = 257
- Height = 33
- Frequency = 10
- TabOrder = 7
- OnChange = TrackBar2Change
- end
- object TrackBar3: TTrackBar
- Left = 712
- Top = 616
- Width = 257
- Height = 33
- Frequency = 10
- TabOrder = 8
- OnChange = TrackBar3Change
- end
- object Button1: TButton
- Left = 520
- Top = 656
- Width = 129
- Height = 25
- Caption = #32622#25442#29305#25928
- TabOrder = 9
- OnClick = Button1Click
- end
- object TrackBar4: TTrackBar
- Left = 712
- Top = 640
- Width = 257
- Height = 33
- Max = 100
- Min = 1
- Frequency = 20
- Position = 1
- TabOrder = 10
- OnChange = TrackBar4Change
- end
- object TrackBar5: TTrackBar
- Left = 96
- Top = 616
- Width = 233
- Height = 33
- Max = 100
- Frequency = 55
- TabOrder = 11
- OnChange = TrackBar5Change
- end
- object TrackBar6: TTrackBar
- Left = 96
- Top = 640
- Width = 233
- Height = 33
- Max = 100
- Min = -100
- Frequency = 55
- Position = 1
- TabOrder = 12
- OnChange = TrackBar6Change
- end
- object Button3: TButton
- Left = 336
- Top = 616
- Width = 113
- Height = 25
- Caption = #30830#35748#20142#24230#23545#27604#24230
- TabOrder = 13
- OnClick = Button3Click
- end
- object OpenDialog1: TOpenDialog
- Filter = 'bmp'#25991#20214'|*.bmp'
- Left = 104
- Top = 16
- end
- object OpenDialog2: TOpenDialog
- Filter = 'bmp'#25991#20214'|*.bmp'
- Left = 608
- Top = 16
- end
- end
这篇关于原创 ···DELPHI 图片图形图像处理 PS置换滤镜效果,亮度/对比度,纹理贴图效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!