Delphi基本圖像處理方法_第1頁(yè)
Delphi基本圖像處理方法_第2頁(yè)
Delphi基本圖像處理方法_第3頁(yè)
Delphi基本圖像處理方法_第4頁(yè)
Delphi基本圖像處理方法_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、本文實(shí)例匯總了Delphi基本圖像處理方法。分享給大家供大家參考。具體分析如下: /浮雕 procedure Emboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer;overload; var i, j, Gray, Azimuthvalue, R, G, B: integer; SrcRGB, SrcRGB1, SrcRGB2, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLinei; DestRGB := De

2、stBmp.ScanLinei; if (AzimuthChange >= -180 and (AzimuthChange < -135 then begin if i > 0 then SrcRGB1 := SrcBmp.ScanLinei-1 else SrcRGB1 := SrcRGB; Inc(SrcRGB1; SrcRGB2 := SrcRGB; Inc(SrcRGB2; end else if (AzimuthChange >= -135 and (AzimuthChange < -90 then begin if i > 0 then SrcR

3、GB1 := SrcBmp.ScanLinei-1 else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; Inc(SrcRGB2; end else if (AzimuthChange >= -90 and (AzimuthChange < -45 then begin if i > 0 then SrcRGB1 := SrcBmp.ScanLinei-1 else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; end else if (AzimuthChange >= -45 and (AzimuthC

4、hange < 0 then begin SrcRGB1 := SrcRGB; if i > 0 then SrcRGB2 := SrcBmp.ScanLinei-1 else SrcRGB2 := SrcRGB; end else if (AzimuthChange >= 0 and (AzimuthChange < 45 then begin SrcRGB2 := SrcRGB; if (i < SrcBmp.Height - 1 then SrcRGB1 := SrcBmp.ScanLinei+1 else SrcRGB1 := SrcRGB; end el

5、se if (AzimuthChange >= 45 and (AzimuthChange < 90 then begin if (i < SrcBmp.Height - 1 then SrcRGB1 := SrcBmp.ScanLinei+1 else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; end else if (AzimuthChange >= 90 and (AzimuthChange < 135 then begin if (i < SrcBmp.Height - 1 then SrcRGB1 := SrcB

6、mp.ScanLinei+1 else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; Inc(SrcRGB1; end else if (AzimuthChange >= 135 and (AzimuthChange <= 180 then begin if (i < SrcBmp.Height - 1 then SrcRGB2 := SrcBmp.ScanLinei+1 else SrcRGB2 := SrcRGB; Inc(SrcRGB2; SrcRGB1 := SrcRGB; Inc(SrcRGB1; end; for j := 0 to

7、 SrcBmp.Width - 1 do begin if (AzimuthChange >= -180 and (AzimuthChange < -135 then begin Azimuthvalue := AzimuthChange + 180; R:=SrcRGB.rgbtRed-(SrcRGB1.rgbtRed*Azimuthvalue div 45-(SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue div 45-(SrcRGB2

8、.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= -135 and (AzimuthChange < -90 then begin Azimuthvalue := AzimuthChange + 135; R:=SrcRGB.rgbtRed-(SrcRGB1.rgbtRed*Azimuthva

9、lue div 45-(SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue div 45-(SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcR GB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= -

10、90 and (AzimuthChange < -45 then begin if j=1 then Inc(SrcRGB1,-1; Azimuthvalue := AzimuthChange + 90; R:=SrcRGB.rgbtRed-(SrcRGB1.rgbtRed*Azimuthvalue div 45-(SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue div 45-(SrcRGB2.rgbtGreen*(45-Azimuthvalue

11、 div 45+78; B:=SrcRGB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= -45 and (AzimuthChange < 0 then begin if j=1 then begin Inc(SrcRGB1,-1; Inc(SrcRGB2,-1; end; Azimuthvalue := AzimuthChange + 45; R:=SrcRGB.rgbtRed-(S

12、rcRGB1.rgbtRed*Azimuthvalue div 45-(SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue div 45-(SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if

13、 (AzimuthChange >= 0 and (AzimuthChange < 45 then begin if j=1 then begin Inc(SrcRGB1,-1; Inc(SrcRGB2,-1; end; Azimuthvalue := AzimuthChange; R:=SrcRGB.rgbtRed-(SrcRGB1.rgbtRed*Azimuthvalue div 45-(SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue

14、div 45-(SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= 45 and (AzimuthChange < 90 then begin if j=1 then Inc(SrcRGB2,-1; Azimuthvalue := AzimuthChange - 45; R:=Sr

15、cRGB.rgbtRed-(SrcRGB1.rgbtRed*Azimuthvalue div 45-(SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue div 45-(SrcRGB2.rgbtGreen*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+

16、78; end else if (AzimuthChange >= 90 and (AzimuthChange < 135 then begin Azimuthvalue := AzimuthChange - 90; R:=SrcRGB.rgbtRed-(SrcRGB1.rgbtRed*Azimuthvalue div 45-(SrcRGB2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue div 45-(SrcRGB2.rgbtGreen*(45-Azi

17、muthvalue div 45+78; B:=SrcRGB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end else if (AzimuthChange >= 135 and (AzimuthChange <= 180 then begin Azimuthvalue := AzimuthChange - 135; R:=SrcRGB.rgbtRed-(SrcRGB1.rgbtRed*Azimuthvalue div 45-(SrcRGB

18、2.rgbtRed*(45-Azimuthvalue div 45+78; G:=SrcRGB.rgbtGreen-(SrcRGB1.rgbtGreen*Azimuthvalue div 45-(SrcRGB2.rgbtGree n*(45-Azimuthvalue div 45+78; B:=SrcRGB.rgbtBlue-(SrcRGB1.rgbtBlue*Azimuthvalue div 45-(SrcRGB2.rgbtBlue*(45-Azimuthvalue div 45+78; end; R:=Min(R,255; R:=Max(R,0; G:=Min(G,255; G:=Max(

19、G,0; B:=Min(B,255; B:=Max(B,0; Gray := (R shr 2 + (R shr 4 + (G shr 1 + (G shr 4 + (B shr 3; DestRGB.rgbtRed:=Gray; DestRGB.rgbtGreen:=Gray; DestRGB.rgbtBlue:=Gray; if (j=-180 and (AzimuthChange<-135 or (AzimuthChange>=90 and (AzimuthChange<=180 then begin Inc(SrcRGB1; end; if (j=135 and (A

20、zimuthChange<180 or (AzimuthChange>=-180 and (AzimuthChange<=-90 then begin Inc(SrcRGB2; end; Inc(SrcRGB; Inc(DestRGB; end; end; end; procedure Emboss(Bmp:TBitmap;AzimuthChange:integer;ElevationChange:integer;WeightChange:integer;overload; var DestBmp:TBitmap; begin DestBmp:=TBitmap.Create;

21、 DestBmp.Assign(Bmp; Emboss(Bmp,DestBmp,AzimuthChange,ElevationChange,WeightChange; Bmp.Assign(DestBmp; end; /反色 procedure Negative(Bmp:TBitmap; var i, j: Integer; PRGB: pRGBTriple; begin Bmp.PixelFormat:=pf24Bit; for i := 0 to Bmp.Height - 1 do begin PRGB := Bmp.ScanLinei; for j := 0 to Bmp.Width -

22、 1 do begin PRGB.rgbtRed :=not PRGB.rgbtRed ; PRGB.rgbtGreen :=not PRGB.rgbtGreen; PRGB.rgbtBlue :=not PRGB.rgbtBlue; Inc(PRGB; end; end; end; /曝光 procedure Exposure(Bmp:TBitmap; var i, j: integer; PRGB: pRGBTriple; begin Bmp.PixelFormat:=pf24Bit; for i := 0 to Bmp.Height - 1 do begin PRGB := Bmp.Sc

23、anLinei; for j := 0 to Bmp.Width - 1 do begin if PRGB.rgbtRed<128 then PRGB.rgbtRed :=not PRGB.rgbtRed ; if PRGB.rgbtGreen<128 then PRGB.rgbtGreen :=not PRGB.rgbtGreen; if PRGB.rgbtBlue<128 then PRGB.rgbtBlue :=not PRGB.rgbtBlue; Inc(PRGB; end; end; end; /模糊 procedure Blur(SrcBmp:TBitmap; v

24、ar i, j:Integer; SrcRGB:pRGBTriple; SrcNextRGB:pRGBTriple; SrcPreRGB:pRGBTriple; Value:Integer; procedure IncRGB; begin Inc(SrcPreRGB; Inc(SrcRGB; Inc(SrcNextRGB; end; procedure DecRGB; begin Inc(SrcPreRGB,-1; Inc(SrcRGB,-1; Inc(SrcNextRGB,-1; end; begin SrcBmp.PixelFormat:=pf24Bit; for i := 0 to Sr

25、cBmp.Height - 1 do begin if i > 0 then SrcPreRGB:=SrcBmp.ScanLinei-1 else SrcPreRGB := SrcBmp.ScanLinei; SrcRGB := SrcBmp.ScanLinei; if i < SrcBmp.Height - 1 then SrcNextRGB:=SrcBmp.ScanLinei+1 else SrcNextRGB:=SrcBmp.ScanLinei; for j := 0 to SrcBmp.Width - 1 do begin if j > 0 then DecRGB;

26、Value:=SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed; if j > 0 then IncRGB; Value:=Value+SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed; if j < SrcBmp.Width - 1 then IncRGB; Value:=(Value+SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed div 9; DecRGB; SrcRGB.rgbtRed:=value; if j

27、> 0 then DecRGB; Value:=SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen; if j > 0 then IncRGB; Value:=Value+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen; if j < SrcBmp.Width - 1 then IncRGB; Value:=(Value+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen div 9

28、; DecRGB; SrcRGB.rgbtGreen:=value; if j > 0 then DecRGB; Value:=SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue; if j > 0 then IncRGB; Value:=Value+SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue; if j < SrcBmp.Width - 1 then IncRGB; Value:=(Value+SrcPreRGB.rgbtBlue+SrcRGB.rgb

29、tBlue+SrcNextRGB.rgbtBlue div 9; DecRGB; SrcRGB.rgbtBlue:=value; IncRGB; end; end; end; /銳化 procedure Sharpen(SrcBmp:TBitmap; var i, j: integer; SrcRGB: pRGBTriple; SrcPreRGB: pRGBTriple; Value: integer; begin SrcBmp.PixelFormat:=pf24Bit; for i := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.Sca

30、nLinei; if i > 0 then SrcPreRGB:=SrcBmp.ScanLinei-1 else SrcPreRGB:=SrcBmp.ScanLinei; for j := 0 to SrcBmp.Width - 1 do begin if j = 1 then Dec(SrcPreRGB; Value:=SrcRGB.rgbtRed+(SrcRGB.rgbtRed-SrcPreRGB.rgbtRed div 2; Value:=Max(0,Value; Value:=Min(255,Value; SrcRGB.rgbtRed:=value; Value:=SrcRGB.

31、rgbtGreen+(SrcRGB.rgbtGreen-SrcPreRGB.rgbtGreen div 2; Value:=Max(0,Value; Value:=Min(255,Value; SrcRGB.rgbtGreen:=value; Value:=SrcRGB.rgbtBlue+(SrcRGB.rgbtBlue-SrcPreRGB.rgbtBlue div 2; Value:=Max(0,Value; Value:=Min(255,Value; SrcRGB.rgbtBlue:=value; Inc(SrcRGB; Inc(SrcPreRGB; end; end; end; 圖像的旋

32、轉(zhuǎn)和翻轉(zhuǎn) 以下代碼用ScanLine配合指針移動(dòng)實(shí)現(xiàn),用于24位色! /旋轉(zhuǎn)90度 procedure Rotate90(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple; Bmp:TBitmap; Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Height; Bmp.Height := Bitmap.Width; Bmp.PixelFormat := pf24bit; Width:=Bitmap.Width-1; Height

33、:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLinej; for i := 0 to Width do begin rowOut := Bmp.ScanLinei; Inc(rowOut,Height - j; rowOut := rowIn; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; /旋轉(zhuǎn)180度 procedure Rotate180(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBT

34、riple; Bmp:TBitmap; Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Width; Bmp.Height := Bitmap.Height; Bmp.PixelFormat := pf24bit; Width:=Bitmap.Width-1; Height:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLinej; for i := 0 to Width do begin rowOut := Bmp

35、.ScanLineHeight - j; Inc(rowOut,Width - i; rowOut := rowIn; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; /旋轉(zhuǎn)270度 procedure Rotate270(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOu Original := Bitmap.Height-Round(j+1*CosTheta-(i+1-SinPoint*SinTheta; iOriginal := Bitmap.Width-Round(i+1*CosTheta-(C

36、osPoint-j-1*SinTheta; end; 270: begin iOriginal := Bitmap.Width-Round(j+1*SinTheta-(i+1-SinPoint*CosTheta; jOriginal := Round(i+1*SinTheta-(CosPoint-j-1*CosTheta-1; end; end; if (iOriginal >= 0 and (iOriginal <= Bitmap.Width-1and (jOriginal >= 0 and (jOriginal <= Bitmap.Height-1 then beg

37、in RowOriginal := Bitmap.ScanlinejOriginal; Inc(RowOriginal,iOriginal; RowRotated := RowOriginal; Inc(RowRotated; end else begin Inc(RowRotated; end; end; end; end; end; /水平翻轉(zhuǎn) procedure FlipHorz(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple; Bmp:TBitmap; Width,Height:Integer; begin

38、Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Width; Bmp.Height := Bitmap.Height; Bmp.PixelFormat := pf24bit; Width:=Bitmap.Width-1; Height:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLinej; for i := 0 to Width do begin rowOut := Bmp.ScanLinej; Inc(rowOut,Width - i; rowOut := rowI

39、n; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; /垂直翻轉(zhuǎn) procedure FlipVert(const Bitmap:TBitmap; var i,j:Integer; rowIn,rowOut:pRGBTriple; Bmp:TBitmap; Width,Height:Integer; begin Bmp:=TBitmap.Create; Bmp.Width := Bitmap.Height; Bmp.Height := Bitmap.Width; Bmp.PixelFormat := pf24bit; Width:=Bitmap.Wid

40、th-1; Height:=Bitmap.Height-1; for j := 0 to Height do begin rowIn := Bitmap.ScanLinej; for i := 0 to Width do begin rowOut := Bmp.ScanLineHeight - j; Inc(rowOut,i; rowOut := rowIn; Inc(rowIn; end; end; Bitmap.Assign(Bmp; end; 亮度、對(duì)比度、飽和度的調(diào)整 以下代碼用ScanLine配合指針移動(dòng)實(shí)現(xiàn)! function Min(a, b: integer: integer;

41、 begin if a < b then result := a else result := b; end; function Max(a, b: integer: integer; begin if a > b then result := a else result := b; end; /亮度調(diào)整 procedure BrightnessChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer; var i, j: integer; SrcRGB, DestRGB: pRGBTriple; begin for i :=

42、0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLinei; DestRGB := DestBmp.ScanLinei; for j := 0 to SrcBmp.Width - 1 do begin if ValueChange > 0 then begin DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange; DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange; DestRGB.rgbtBlue

43、:= Min(255, SrcRGB.rgbtBlue + ValueChange; end else begin DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed + ValueChange; DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + ValueChange; DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue + ValueChange; end; Inc(SrcRGB; Inc(DestRGB; end; end; end; /對(duì)比度調(diào)整 procedure Contra

44、stCh ange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer; var i, j: integer; SrcRGB, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLinei; DestRGB := DestBmp.ScanLinei; for j := 0 to SrcBmp.Width - 1 do begin if ValueChange>=0 then begin if SrcRGB.rgbtR

45、ed >= 128 then DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange else DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed - ValueChange; if SrcRGB.rgbtGreen >= 128 then DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen - ValueChange; if

46、SrcRGB.rgbtBlue >= 128 then DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange else DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue - ValueChange; end else begin if SrcRGB.rgbtRed >= 128 then DestRGB.rgbtRed := Max(128, SrcRGB.rgbtRed + ValueChange else DestRGB.rgbtRed := Min(128, SrcRGB.rg

47、btRed - ValueChange; if SrcRGB.rgbtGreen >= 128 then DestRGB.rgbtGreen := Max(128, SrcRGB.rgbtGreen + ValueChange else DestRGB.rgbtGreen := Min(128, SrcRGB.rgbtGreen - ValueChange; if SrcRGB.rgbtBlue >= 128 then DestRGB.rgbtBlue := Max(128, SrcRGB.rgbtBlue + ValueChange else DestRGB.rgbtBlue :

48、= Min(128, SrcRGB.rgbtBlue - ValueChange; end; Inc(SrcRGB; Inc(DestRGB; end; end; end; /飽和度調(diào)整 procedure SaturationChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer; var Grays: array0.767 of Integer; Alpha: array0.255 of Word; Gray, x, y: Integer; SrcRGB,DestRGB: pRGBTriple; i: Byte; begin Valu

49、eChange:=ValueChange+255; for i := 0 to 255 do Alphai := (i * ValueChange Shr 8; x := 0; for i := 0 to 255 do begin Gray := i - Alphai; Graysx := Gray; Inc(x; Graysx := Gray; Inc(x; Graysx := Gray; Inc(x; end; for y := 0 to SrcBmp.Height - 1 do begin SrcRGB := SrcBmp.ScanLineY; DestRGB := DestBmp.Sc

50、anLineY; for x := 0 to SrcBmp.Width - 1 do begin Gray := GraysSrcRGB.rgbtRed + SrcRGB.rgbtGreen + SrcRGB.rgbtBlue; if Gray + AlphaSrcRGB.rgbtRed>0 then DestRGB.rgbtRed := Min(255,Gray + AlphaSrcRGB.rgbtRed else DestRGB.rgbtRed := 0; if Gray + AlphaSrcRGB.rgbtGreen>0 then DestRGB.rgbtGreen := M

51、in(255,Gray + AlphaSrcRGB.rgbtGreen else DestRGB.rgbtGreen := 0; if Gray + AlphaSrcRGB.rgbtBlue>0 then DestRGB.rgbtBlue := Min(255,Gray + AlphaSrcRGB.rgbtBlue else DestRGB.rgbtBlue := 0; Inc(SrcRGB; Inc(DestRGB; end; end; end; /RGB調(diào)整 procedure RGBChange(SrcBmp,DestBmp:TBitmap;RedChange,GreenChang

52、e,BlueChange:integer; var SrcRGB, DestRGB: pRGBTriple; i,j:integer; begin for i := 0 to SrcBmp.Height- 1 do begin SrcRGB := SrcBmp.ScanLinei; DestRGB :=DestBmp.ScanLinei; for j := 0 to SrcBmp.Width - 1 do begin if RedChange> 0 then DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + RedChange else DestR

53、GB.rgbtRed := Max(0, SrcRGB.rgbtRed + RedChange; if GreenChange> 0 then DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + GreenChange else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + GreenChange; if BlueChange> 0 then DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + BlueChange else DestRGB.rgb

54、tBlue := Max(0, SrcRGB.rgbtBlue + BlueChange; Inc(SrcRGB; Inc(DestRGB; end; end; end; 顏色調(diào)整 /RGB<=>BGR procedure RGB2BGR(const Bitmap:TBitmap; var X: Integer; Y: Integer; PRGB: pRGBTriple; Color: Byte; begin for Y := 0 to (Bitmap.Height - 1 do begin for X := 0 to (Bitmap.Width - 1 do begin Colo

55、r := PRGB.rgbtRed; PRGB.rgbtRed := PRGB.rgbtBlue; PRGB.rgbtBlue := Color; Inc(PRGB; end; end end; end; /灰度化(加權(quán) procedure Grayscale(const Bitmap:TBitmap; var X: Integer; Y: Integer; PRGB: pRGBTriple; Gray: Byte; begin for Y := 0 to (Bitmap.Height - 1 do begin PRGB := Bitmap.ScanLineY; for X := 0 to (

56、Bitmap.Width - 1 do begin Gray := (77 * Red + 151 * Green + 28 * Blue shr 8; PRGB.rgbtRed:=Gray; PRGB.rgbtGreen:=Gray; PRGB.rgbtBlue:=Gray; Inc(PRGB; end; end; end; 繪圖區(qū)即窗口顯示圖像的區(qū)域,亦可為全屏幕(在全屏幕下繪圖的效果比一般窗口下好) 中心點(diǎn)即要繪圖區(qū)顯示的中心點(diǎn)在原始圖像的坐標(biāo)(聲明:這個(gè)概念特別重要) 先說(shuō)說(shuō)圖像的放大,要放大一張圖片,我們一般的做法是直接放大圖像,但本文介紹的方法僅放大我們能夠看到的部分,放大分兩種情

57、況,一種是放大后比繪圖區(qū)還要小,這種情況沒(méi)什么好說(shuō),當(dāng)然是顯示全部的圖像;第二種是放大后的圖像比繪圖區(qū)大,這才是我們今天要討論的重點(diǎn)話題,這種情況下我們先要確定圖像放大后的大小,然后根據(jù)“中心點(diǎn)”計(jì)算在原始圖像的位置和大小,最后把截取的圖像放大到繪圖區(qū)。 再說(shuō)說(shuō)圖像的漫游,當(dāng)顯示的圖像超過(guò)繪圖區(qū)時(shí),我們需要對(duì)圖像進(jìn)行漫游,以便看到全部的圖像。原理是:當(dāng)鼠標(biāo)在繪圖區(qū)進(jìn)行單擊時(shí),這時(shí)開始漫游,先記錄鼠標(biāo)的單擊位置,然后檢測(cè)鼠標(biāo)的移動(dòng),根據(jù)鼠標(biāo)和上次的位移計(jì)算出“中心點(diǎn)”(需要將屏幕坐標(biāo)轉(zhuǎn)換為原始圖像坐標(biāo)),根據(jù)在上面放大的原理到原始圖像中取出要顯示的部分,放大顯示到繪圖區(qū)。 算法實(shí)現(xiàn)篇: 1.圖像放大 變量定義: PZoom:放大率(整數(shù):100時(shí)為100%,根據(jù)需要可以將 100 該為 10000 或者更大些,但不推薦使用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論