Contoh dalam artikel ini merangkum metode dasar pemrosesan gambar Delphi. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
//prosedur emboss Emboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer);overload;var i, j, Gray, Azimuthvalue, R, G, B: integer; = 0 hingga SrcBmp.Height - 1 dimulai SrcRGB := SrcBmp.ScanLine[i]; DestRGB := DestBmp.ScanLine[i]; jika (AzimuthChange >= -180) dan (AzimuthChange < -135) maka dimulai jika i > 0 maka SrcRGB1 := SrcBmp.ScanLine[i-1] lain SrcRGB1 := SrcRGB; Inc(SrcRGB1); := SrcRGB; Inc(SrcRGB2); akhiri else if (AzimuthChange >= -135) dan (AzimuthChange < -90) lalu mulai jika i > 0 lalu SrcRGB1 := SrcBmp.ScanLine[i-1] else SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; Inc(SrcRGB2); akhiri yang lain jika (AzimuthChange >= -90) dan (AzimuthChange < -45) lalu mulai jika i > 0 lalu SrcRGB1 := SrcBmp.ScanLine[i-1] else SrcRGB1 := SrcRGB2 := SrcRGB1 diakhiri else if (AzimuthChange >= -45) dan (AzimuthChange < 0) lalu mulai SrcRGB1 := SrcRGB; jika i > 0 maka SrcRGB2 := SrcBmp.ScanLine[i-1] else SrcRGB2 := SrcRGB; akhiri else if (AzimuthChange >= 0) dan (AzimuthChange < 45) lalu mulai SrcRGB2 := SrcRGB; SrcBmp.Tinggi - 1) lalu SrcRGB1 := SrcBmp.ScanLine[i+1] else SrcRGB1 := SrcRGB; akhiri else if (AzimuthChange >= 45) dan (AzimuthChange < 90) lalu mulai if (i < SrcBmp.Height - 1) lalu SrcRGB1 := SrcBmp.ScanLine[i +1] lain SrcRGB1 := SrcRGB; SrcRGB2 := SrcRGB1; akhiri else if (AzimuthChange >= 90) dan (AzimuthChange < 135) lalu mulai if (i < SrcBmp.Height - 1) lalu SrcRGB1 := SrcBmp.ScanLine[i+1] else SrcRGB1 := SrcRGB2 := SrcRGB1; Inc(SrcRGB1); akhiri yang lain jika (AzimuthChange >= 135) dan (AzimuthChange <= 180) lalu mulai if (i < SrcBmp.Height - 1) lalu SrcRGB2 := SrcBmp.ScanLine[i+1] else SrcRGB2 := SrcRGB Inc(SrcRGB2); = SrcRGB; Inc(SrcRGB1); akhir; untuk j := 0 hingga SrcBmp.Width - 1 dimulai jika (AzimuthChange >= -180) dan (AzimuthChange < -135) lalu mulai Azimuthvalue := AzimuthChange + 180 R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*Azimuthvalue div 45)-((SrcRGB2.rgbtRed)*(45-nilai Azimut) div 45)+78; G:=SrcRGB.rgbtHijau-((SrcRGB1.rgbtHijau)*nilai azimut div 45)-((SrcRGB2.rgbtHijau)*(45- Nilai azimuth)div 45)+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)*nilai Azimuth div 45)-((SrcRGB2.rgbtBlue)*(45-Azimuthvalue) div 45)+78; akhiri yang lain jika (AzimuthChange >= -135) dan (AzimuthChange < -90) lalu mulai Nilai Azimuth := Perubahan Azimuth + 135; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*nilai Azimuth div 45)-((SrcRGB2.rgbtRed)*(45-Nilai Azimuth) div 45)+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)*nilai Azimuth div 45)-((SrcRGB2.rgbtGreen)*(45-Azimuthvalue) div 45)+78; *Div nilai azimuth 45)-((SrcRGB2.rgbtBlue)*(45-Azimuthvalue) div 45)+78; akhiri yang lain jika (AzimuthChange >= -90) dan (AzimuthChange < -45) lalu mulai jika j=1 lalu Inc(SrcRGB1,- 1); Nilai Azimuth := Perubahan Azimuth + 90; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*nilai Azimuth div 45)-((SrcRGB2.rgbtRed)*(45-Nilai Azimuth) div 45)+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen) *Div nilai azimuth 45)-((SrcRGB2.rgbtGreen)*(45-Nilai Azimuth) div 45)+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)*div nilai Azimuth 45)-((SrcRGB2.rgbtBlue)*(45- Nilai Azimuth) div 45)+78; akhiri yang lain if (AzimuthChange >= -45) dan (AzimuthChange < 0) maka mulai jika j=1 maka mulai Inc(SrcRGB1,-1); Inc(SrcRGB2,-1 akhir; SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*div nilai azimuth 45)-((SrcRGB2.rgbtRed)*(45-nilai Azimut) div 45)+78; G:=SrcRGB.rgbtHijau-((SrcRGB1.rgbtHijau)*nilai azimut div 45)-((SrcRGB2.rgbtHijau)*(45- Nilai azimuth)div 45)+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)*nilai Azimuth div 45)-((SrcRGB2.rgbtBlue)*(45-Azimuthvalue) div 45)+78; akhiri yang lain jika (AzimuthChange >= 0) dan (AzimuthChange < 45) lalu mulai jika j=1 maka mulai Inc(SrcRGB1,-1); Inc(SrcRGB2,-1); akhir; Nilai Azimuth := Perubahan Azimuth; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*nilai Azimuth div 45)-((SrcRGB2.rgbtRed)*( 45-Nilai Azimuth)div 45)+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen)*nilai Azimuth div 45)-((SrcRGB2.rgbtGreen)*(45-Azimuthvalue) div 45)+78; *Div nilai azimuth 45)-((SrcRGB2.rgbtBlue)*(45-Azimuthvalue) div 45)+78; akhiri yang lain jika (AzimuthChange >= 45) dan (AzimuthChange < 90) maka mulai jika j=1 maka Inc(SrcRGB2,-1) ; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*nilai Azimuth div 45)-((SrcRGB2.rgbtRed)*(45-Nilai Azimuth) div 45)+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen) *Div nilai azimuth 45)-((SrcRGB2.rgbtGreen)*(45-Nilai Azimuth) div 45)+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)*div nilai Azimuth 45)-((SrcRGB2.rgbtBlue)*(45- Nilai Azimuth) div 45)+78; akhiri yang lain if (AzimuthChange >= 90) dan (AzimuthChange < 135) maka mulai Azimuthvalue := AzimuthChange - 90; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*Azimuthvalue div 45)-((SrcRGB2.rgbtRed)*(45 -Nilai Azimuth) div 45)+78; G:=SrcRGB.rgbtHijau-((SrcRGB1.rgbtHijau)*nilai Azimuth div 45)-((SrcRGB2.rgbtHijau)*(45-Nilai Azimuth) div 45)+78; (SrcRGB1.rgbtBlue)*Nilai azimuth div 45)-((SrcRGB2.rgbtBlue)*(45-Azimuthvalue) div 45)+78; akhiri yang lain jika (AzimuthChange >= 135) dan (AzimuthChange <= 180) lalu mulai Azimuthvalue := AzimuthChange - 135; R:=SrcRGB.rgbtRed-((SrcRGB1.rgbtRed)*nilai Azimuth div 45)-((SrcRGB2.rgbtRed)*(45-Nilai Azimuth) div 45)+78; G:=SrcRGB.rgbtGreen-((SrcRGB1.rgbtGreen) *Div nilai azimuth 45)-((SrcRGB2.rgbtGreen)*(45-Nilai Azimuth) div 45)+78; B:=SrcRGB.rgbtBlue-((SrcRGB1.rgbtBlue)*div nilai Azimuth 45)-((SrcRGB2.rgbtBlue)*(45- Nilai azimuth) div 45)+78; R:=Min(R,255); R:=Maks(R,0); G:=Min(G,255); B:=Maks(B,0); Abu-abu := (R shr 2) + (R shr 4) + (G shr 1) + (G shr 4) + (B shr 3); DestRGB.rgbtRed:=Abu-abu; DestRGB.rgbtHijau:=Abu-abu; DestRGB.rgbtBiru:=Abu-abu; jika (j=-180) dan (AzimuthChange<-135)) atau ((AzimuthChange>=90) dan (AzimuthChange<=180 ))) lalu mulai Inc(SrcRGB1); (j=135) dan (AzimuthChange<180)) atau ((AzimuthChange>=-180) dan (AzimuthChange<=-90))) lalu mulai Inc(SrcRGB2); akhir; akhir; akhir; prosedur Emboss(Bmp:TBitmap;AzimuthChange:integer;ElevationChange:integer;WeightChange:integer);overload;var DestBmp:TBitmap;mulai DestBmp:=TBitmap.Create; DestBmp.Assign(Bmp); ,Perubahan Berat); Bmp.Assign(DestBmp);end;//Prosedur terbalik Negatif(Bmp:TBitmap);var i, j: Integer; PRGB: pRGBTriple;mulai Bmp.PixelFormat:=pf24Bit; lakukan mulai PRGB := Bmp.ScanLine[i]; untuk j := 0 hingga Bmp.Width - 1 lakukan mulai PRGB^.rgbtRed :=bukan PRGB^.rgbtRed ; PRGB^.rgbtGreen :=bukan PRGB^.rgbtGreen; PRGB^.rgbtBlue :=bukan PRGB^.rgbtBlue; Prosedur pemaparan Eksposur(Bmp:TBitmap);var i, j: integer; PRGB: pRGBTriple;mulai Bmp.PixelFormat:=pf24Bit; untuk i := 0 hingga Bmp.Height - 1 dimulai jika PRGB^.rgbtRed<128 lalu PRGB^.rgbtRed :=bukan PRGB^.rgbtRed ; jika PRGB^.rgbtGreen<128 lalu PRGB^.rgbtGreen :=bukan PRGB^.rgbtGreen; jika PRGB^.rgbtBlue<128 maka PRGB^.rgbtBlue :=bukan PRGB^.rgbtBlue Inc(PRGB end;end;//blur procedure Blur( SrcBmp:TBitmap);var i, j:Integer; SrcNextRGB:pRGBTriple; SrcPreRGB:pRGBTriple; Nilai:Integer; prosedur IncRGB; mulai Inc(SrcNextRGB,-1); SrcBmp.PixelFormat:=pf24Bit; untuk i := 0 hingga SrcBmp.Height - 1 dimulai jika i > 0 maka SrcPreRGB:=SrcBmp.ScanLine[i-1] else SrcPreRGB := SrcBmp.ScanLine[i]; SrcBmp.ScanLine[i]; jika saya < SrcBmp.Tinggi - 1 lalu SrcNextRGB:=SrcBmp.ScanLine[i+1] else SrcNextRGB:=SrcBmp.ScanLine[i]; untuk j := 0 hingga SrcBmp.Width - 1 dimulai jika j > 0 maka DecRGB Nilai:=SrcPreRGB.rgbtRed+ SrcRGB .rgbtRed+SrcNextRGB.rgbtRed; jika j > 0 lalu IncRGB; Nilai:=(Nilai+SrcPreRGB.rgbtRed+SrcRGB.rgbtRed+SrcNextRGB.rgbtRed) div 9; DecRGB; SrcRGB.rgbtRed:=nilai; jika j > 0 maka DecRGB; Nilai:=SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen; Nilai:=Nilai+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen; jika j < SrcBmp.Width - 1 maka IncRGB; Nilai:=(Nilai+SrcPreRGB.rgbtGreen+SrcRGB.rgbtGreen+SrcNextRGB.rgbtGreen) div 9; ; SrcRGB.rgbtGreen:=nilai; jika j>0 maka DecRGB; Nilai:=SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcRGB.rgbtBlue jika j>0 maka IncRGB; .rgbtBiru; jika j < SrcBmp.Width - 1 lalu IncRGB; Nilai:=(Nilai+SrcPreRGB.rgbtBlue+SrcRGB.rgbtBlue+SrcNextRGB.rgbtBlue) div 9; Pertajam(SrcBmp:TBitmap);var i, j: bilangan bulat; SrcPreRGB:=SrcBmp.ScanLine[i-1] else SrcPreRGB:=SrcBmp.ScanLine[i]; untuk j := 0 hingga SrcBmp.Width - 1 dimulai jika j = 1 maka Des(SrcPreRGB); rgbtRed+(SrcRGB.rgbtRed-SrcPreRGB.rgbtRed) div 2; Nilai:=Maks(0,Nilai); Nilai:=Min(255,Nilai); SrcRGB.rgbtRed:=nilai; Nilai:=SrcRGB.rgbtGreen+(SrcRGB.rgbtGreen-SrcPreRGB.rgbtGreen) div 2; Maks(0,Nilai);Nilai:=Min(255,Nilai); SrcRGB.rgbtHijau:=nilai; Nilai:=SrcRGB.rgbtBiru+(SrcRGB.rgbtBlue-SrcPreRGB.rgbtBlue) div 2; Nilai:=Maks(0,Nilai):=Min(255,Nilai); nilai; Inc(SrcRGB); Inc(SrcPreRGB); [Rotasi dan pembalikan gambar] Kode berikut diimplementasikan menggunakan ScanLine dengan gerakan penunjuk, untuk warna 24-bit! //Putar prosedur 90 derajat Rotate90(const Bitmap:TBitmap);var i,j:Integer; rowIn,rowOut:pRGBTriple; Bitmap.Tinggi; Bmp.Tinggi := Bitmap.Lebar; Bmp.PixelFormat := pf24bit; = Bmp.ScanLine[i]; Inc(barisKeluar,Tinggi - j); barisKeluar^ := barisDalam^; Inc(akhir baris); Bitmap.Assign(Bmp);end;//Putar prosedur 180 derajat Rotate180(const Bitmap:TBitmap);var i,j:Integer; rowIn,rowOut:pRGBTriple; TBitmap.Buat; Bmp.Lebar := Bitmap.Lebar; Bmp.Tinggi := Bitmap.Height; Bmp.PixelFormat := pf24bit; Lebar:=Bitmap.Width-1; Tinggi:=Bitmap.Height-1; untuk j := 0 hingga Tinggi dimulai rowIn := Bitmap.ScanLine[j]; := 0 hingga Lebar mulai rowOut := Bmp.ScanLine[Tinggi - j]; Inc(rowOut,Width - i); rowOut^ := rowIn^; Inc(rowIn); end; Bitmap.Assign(Bmp);end;//Rotate prosedur 270 derajat Rotate270(const Bitmap:TBitmap);var i,j:Integer; pRGBTriple; Bmp:TBitmap;Lebar,Tinggi:Integer;mulai Bmp:=TBitmap.Buat; := Bitmap.Height; Bmp.Height := Bitmap.Width; Bmp.PixelFormat := pf24bit; Lebar:=Bitmap.Width-1; Tinggi:=Bitmap.Height-1; := Bitmap.ScanLine[j]; untuk i := 0 hingga Lebar dimulai rowOut := Bmp.ScanLine[Lebar - i]; Inc(rowOut,j); rowOut^ := rowIn^; Inc(rowIn end; TBitmap;Sudut:Integer;BackColor:TColor):TBitmap;var i,j,iOriginal,jOriginal,CosPoint,SinPoint: integer; RowOriginal,RowRotated : pRGBTriple; ; jika Sudut<0 maka Angle:=360-Abs(Angle); jika Angle=0 maka Result.Assign(Bitmap) else jika Angle=90 maka mulai Result.Assign(Bitmap);//Jika diputar 90 derajat, panggil langsung Kode di atas diakhiri dengan else if (Angle>90) dan (Angle<180) lalu mulai AngleAdd:=90; Angle:=Angle-AngleAdd; end else if Angle=180 lalu mulai Result.Assign(Bitmap180(Result);//Jika diputar 180 derajat, langsung panggil proses di atasend else if (Angle>180) dan ( Angle<270) lalu mulai AngleAdd:=180; Angle:=Angle-AngleAdd; Result.Assign(Bitmap);/Jika diputar 270 derajat, langsung panggil proses di atas untuk mengakhiri jika (Angle>270) dan (Angle<360) lalu mulai AngleAdd:=270; Angle -AngleAdd; akhiri yang lain AngleAdd:=0; jika (Angle>0) dan (Angle<90) maka mulai SinCos((Angle + AngleAdd) * Pi / 180, SinTheta, CosTheta); jika (SinTheta * CosTheta) < 0 maka mulai Result.Width := Round(Abs(Bitmap.Width * CosTheta - Bitmap.Height * SinTheta)); = Bulat(Abs(Bitmap.Lebar * SinTheta - Bitmap.Tinggi * CosTheta)); akhir lagi mulai Hasil.Lebar := Round(Abs(Bitmap.Width * CosTheta + Bitmap.Height * SinTheta)); Result.Height := Round(Abs(Bitmap.Width * SinTheta + Bitmap.Height * CosTheta)); ; CosTheta:=Abs(CosTheta); SinTheta:=Abs(SinTheta); (AngleAdd=0) atau (AngleAdd=180) lalu mulai CosPoint:=Round(Bitmap.Height*CosTheta); SinPoint:=Round(Bitmap.Height*SinTheta); ); CosPoint:=Bulat(Bitmap.Width*SinTheta); untuk j := 0 sampai Result.Height-1 mulai RowRotated := Result.Scanline[j]; untuk i := 0 hingga Result.Width-1 mulai Case AngleAdd dari 0: mulai jOriginal := Round((j+1)*CosTheta-( i+1-SinPoint)*SinTheta)-1; Putaran((i+1)*CosTheta-(CosPoint-j-1)*SinTheta)-1; akhir; 90: mulai iAsli := Putaran((j+1)*SinTheta-(i+1-SinPoint)*CosTheta )-1; jAsli := Bitmap.Tinggi-Bulat((i+1)*SinTheta-(CosPoint-j-1)*CosTheta); akhir; 180: mulai jOriginal := Bitmap.Height-Round((j+1)*CosTheta-(i+1-SinPoint)*SinTheta); iOriginal := Bitmap.Width-Round((i+1)*CosTheta- (CosPoint-j-1)*SinTheta); akhir; 270: mulai iAsli := Bitmap.Lebar-Putaran((j+1)*SinTheta-(i+1-SinPoint)*CosTheta); jAsli := Bulat((i+1)*SinTheta-(CosPoint-j-1)*CosTheta)-1 ; akhir; akhir; jika (iAsli >= 0) dan (iAsli <= Bitmap.Lebar-1)dan (jAsli >= 0) dan (jOriginal <= Bitmap.Height-1) lalu mulai RowOriginal := Bitmap.Scanline[jOriginal]; Inc(RowOriginal,iOriginal); RowOriginal^ := RowOriginal^; ; akhir; akhir; akhir;akhir;//Prosedur balik horizontal FlipHorz(const Bitmap:TBitmap);var i,j:Integer; barisDalam,barisKeluar:pRGBTriple; Bmp:TBitmap; Lebar,Tinggi:Bilangan Bulat;mulai Bmp:=TBitmap.Buat; Format Piksel := pf24bit; Lebar:=Bitmap.Lebar-1; Tinggi:=Bitmap.Tinggi-1; untuk j := 0 hingga Tinggi mulai rowIn := Bitmap.ScanLine[j]; untuk i := 0 hingga Lebar mulai rowOut := Bmp.ScanLine[j]; ,Lebar - i); rowOut^ := rowIn^; Inc(rowIn); Bitmap.Assign(Bmp);end;//prosedur balik vertikal FlipVert(const Bitmap:TBitmap);var i,j:Integer; rowIn,rowOut:pRGBTriple; Tinggi := Bitmap.Lebar; Bmp.PixelFormat := pf24bit; Lebar:=Bitmap.Lebar-1; Tinggi:=Bitmap.Tinggi-1; untuk j := 0 hingga Tinggi dimulai barisDalam := Bitmap.ScanLine[j]; untuk i := 0 hingga Lebar dimulai barisKeluar := Bmp .ScanLine[Tinggi - j]; Inc(barisKeluar,i); barisKeluar^ := barisDalam^; Inc(barisDalam akhir; Bitmap.Assign(Bmp);end;[Penyesuaian kecerahan, kontras, dan saturasi] Kode berikut diimplementasikan menggunakan ScanLine dengan gerakan penunjuk! function Min(a, b: integer): integer;mulai jika a < b maka hasil := a yang lain hasil := b;akhir;fungsi Max(a, b: integer): integer;mulai jika a > b maka hasil : = hasil lain := b;end;//Prosedur penyesuaian kecerahan BrightnessChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);var i, j: integer; SrcRGB, DestRGB: pRGBTriple; mulai untuk i := 0 hingga SrcBmp.Height - 1 mulai SrcRGB := SrcBmp.ScanLine[i]; 1 dimulai jika ValueChange > 0 lalu mulai DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange); DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange); DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange); =Maks(0, SrcRGB.rgbtRed + ValueChange); DestRGB.rgbtGreen := Maks(0, SrcRGB.rgbtGreen + ValueChange); DestRGB.rgbtBlue := Maks(0, SrcRGB.rgbtBlue + ValueChange); ; akhir; akhir;akhir;//prosedur penyesuaian kontras ContrastChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);var i, j: integer; SrcRGB, DestRGB: pRGBTriple;mulai untuk i := 0 hingga SrcBmp.Height - 1 mulai SrcRGB := SrcBmp.ScanLine[i] ; DestRGB := DestBmp.ScanLine[i]; := 0 hingga SrcBmp.Width - 1 dimulai jika ValueChange>=0 lalu mulai jika SrcRGB.rgbtRed >= 128 lalu DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange) else DestRGB.rgbtRed := Max(0 , SrcRGB.rgbtRed - NilaiPerubahan); SrcRGB.rgbtGreen >= 128 lalu DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange) else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen - ValueChange); jika SrcRGB.rgbtBlue >= 128 maka DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange) else DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue - ValueChange); end else dimulai jika SrcRGB.rgbtRed >= 128 lalu DestRGB.rgbtRed := Max(128, SrcRGB.rgbtRed + Perubahan Nilai) yang lain DestRGB.rgbtRed := Min(128, SrcRGB.rgbtRed - ValueChange); jika SrcRGB.rgbtGreen >= 128 maka DestRGB.rgbtGreen := Maks(128, SrcRGB.rgbtGreen + ValueChange) else DestRGB.rgbtGreen := Min(128, SrcRGB .rgbtHijau - ValueChange); jika SrcRGB.rgbtBlue >= 128 maka DestRGB.rgbtBlue := Maks(128, SrcRGB.rgbtBlue + ValueChange) else DestRGB.rgbtBlue := Min(128, SrcRGB.rgbtBlue - ValueChange Inc(SrcRGB); Inc(DestRGB); end;end;//Prosedur penyesuaian saturasi SaturationChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);var Grays: array[0..767] dari Integer Alpha: array[0..255] dari Word Gray , x, y: Integer; SrcRGB,DestRGB: pRGBTiga i: Byte;beginValueChange:=ValueChange+255;untuk i := 0 hingga 255 do Alpha[i] := (i * ValueChange) Shr 8;x := 0;untuk i := 0 hingga 255 dobegin Gray := i - Alpha [i]; Abu-abu[x] := Abu-abu; Inc(x); Abu-abu[x] := Abu-abu; Inc(x); Inc(x);end; untuk y := 0 hingga SrcBmp.Height - 1 dobegin SrcRGB := SrcBmp.ScanLine[Y]; DestRGB := DestBmp.ScanLine[Y]; untuk x := 0 hingga SrcBmp.Width - 1 mulai Abu-abu := Abu-abu[SrcRGB.rgbtRed + SrcRGB.rgbtGreen + SrcRGB.rgbtBlue]; jika Gray + Alpha[SrcRGB.rgbtRed]>0 maka DestRGB.rgbtRed := Min(255,Gray + Alpha[SrcRGB.rgbtRed]) else DestRGB.rgbtRed := 0; jika Gray + Alpha[SrcRGB. rgbtGreen]>0 lalu DestRGB.rgbtGreen := Min(255,Gray + Alpha[SrcRGB.rgbtGreen]) else DestRGB.rgbtGreen := 0; jika Gray + Alpha[SrcRGB.rgbtBlue]>0 maka DestRGB.rgbtBlue := Min(255,Gray + Alpha[SrcRGB.rgbtBlue] ) lain DestRGB.rgbtBlue := 0; Inc(SrcRGB); Inc(DestRGB); akhir;akhir;//prosedur penyesuaian RGB RGBChange(SrcBmp,DestBmp:TBitmap;RedChange,GreenChange,BlueChange:integer);var SrcRGB, DestRGB: pRGBTriple; = 0 hingga SrcBmp.Height- 1 dimulai SrcRGB := SrcBmp.ScanLine[i]; DestRGB :=DestBmp.ScanLine[i]; untuk j := 0 hingga SrcBmp.Width - 1 dimulai jika RedChange> 0 lalu DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + RedChange) lain DestRGB.rgbtRed := Maks(0, SrcRGB.rgbtRed + RedChange); jika GreenChange> 0 maka DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + GreenChange) else DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + GreenChange); .rgbtBiru := Min(255, SrcRGB.rgbtBlue + BlueChange) else DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue + BlueChange); Inc(SrcRGB); Inc(DestRGB); RGB2BGR(konst Bitmap:TBitmap);var X: Bilangan Bulat; Y: Bilangan Bulat; pRGBTriple; = PRGB^.rgbtBiru; PRGB^.rgbtBiru := Warna; Inc(akhir PRGB); end;end;//Prosedur Grayscale (berbobot) Grayscale(const Bitmap:TBitmap);var X: Integer; Y: Integer; PRGB: pRGBTriple; mulai PRGB := Bitmap.ScanLine[Y]; untuk X := 0 sampai (Bitmap.Width - 1) mulai Gray := (77 * Merah + 151 * Hijau + 28 * Biru) shr 8; PRGB^.rgbtMerah:=Abu-abu; PRGB^.rgbtHijau:=PRGB^.rgbtBiru:=Abu-abu; ;
Teori:
Kata kunci:
Area gambar - yaitu area di mana jendela menampilkan gambar, yang juga dapat berupa layar penuh (efek gambar lebih baik di layar penuh daripada di jendela umum)
Titik tengah - yaitu koordinat titik tengah yang akan ditampilkan pada area gambar pada gambar asli (penafian: konsep ini sangat penting)
Mari kita bicara tentang pembesaran gambar terlebih dahulu. Untuk memperbesar gambar, pendekatan umum kita adalah memperbesar gambar secara langsung, namun metode yang diperkenalkan dalam artikel ini hanya memperbesar bagian yang dapat kita lihat pembesarannya lebih besar dari area gambar. Tidak banyak yang bisa dikatakan tentang situasi ini. Gambar; yang kedua adalah gambar yang diperbesar lebih besar dari luas gambar. Ini adalah topik utama yang akan kita bahas hari ini, pertama-tama kita harus menentukan ukuran gambar yang diperbesar, lalu menghitung ukurannya gambar asli berdasarkan posisi dan ukuran "titik tengah", dan terakhir perbesar gambar yang diambil ke area gambar.
Mari kita bicara tentang roaming gambar. Ketika gambar yang ditampilkan melebihi area gambar, kita perlu melakukan roaming pada gambar agar dapat melihat gambar secara keseluruhan. Prinsipnya adalah: ketika mouse mengklik pada area gambar, ia mulai menjelajah, mencatat terlebih dahulu posisi klik mouse, kemudian mendeteksi pergerakan mouse, dan menghitung "titik tengah" berdasarkan mouse dan perpindahan terakhir ( koordinat layar perlu diubah ke koordinat gambar asli), keluarkan bagian yang akan ditampilkan dari gambar asli sesuai dengan prinsip pembesaran di atas, lalu perbesar dan tampilkan di area gambar.
Implementasi algoritma:
1. Pembesaran gambar
Definisi variabel:
PZoom: Tingkat pembesaran (bilangan bulat: 100 adalah 100%, 100 dapat diubah menjadi 10.000 atau lebih besar sesuai kebutuhan, tetapi angka floating point tidak disarankan)
a,b: titik pusat
w, h: lebar dan tinggi gambar asli yang akan diambil
x, y : posisi yang akan dicegat (pojok kiri atas)
sw,sh : lebar dan tinggi gambar asli
p1, p2: rasio pembesaran
aw,ah: ukuran gambar yang diperbesar
pw,ph: ukuran area gambar
vx,vy : posisi yang ditampilkan pada area gambar (pojok kiri atas)
vw, vh: ukuran yang ditampilkan di area gambar
ptx, pty: variabel sementara
Variabel yang diketahui: PZoom, (a, b), (sw, sh), (p1, p2), (aw, ah), (pw, ph)
Variabel yang akan dihitung: (x,y),(w,h),(vx,vy),(vw,vh)
Mulai menghitung:
aw=Round(PZoom*sw/100);ah=Round(PZoom*sh/100);p1=aw/pwp2=ah/ph// Catatan: Round digunakan untuk pembulatan, seperti Int(), Fix di yang lain bahasa ()dll jika p1>1 lalu w=Bulat(sw/p1) lain w=swif p2>1 lalu h=Bulat(sh/p2) lain h=sh// Catatan: shr adalah operator shift kanan, Anda dapat menggunakan ">>1", "div 2", "/2" atau "Round(w/2)" sebagai ganti x=aw shr 1y=bh shr 1 // Catatan: div adalah operator pembagian bilangan bulat ptx=(w*PZoom) div 100pty=(h*PZoom) div 100// Berikut ini perhitungan ukuran dan posisi gambar yang ditampilkan pada area gambar
variabel
Pencent:double; // Rasio zoom wx:double; // Rasio zoom lebar hx:double; // Rasio zoom tinggi // Dapatkan rasio zoom wx:=pw/ptx hx:=ph/pty jika wx>hx lalu Pencent: =hx else Pencent:=wx; // Dapatkan ukuran akhir gambar vw:=Round(Pencent*ptx); vh:=Round(Pencent*pty); Hitung posisi gambar vx:=(pw-vw) div 2; vy:=(ph-vh) div 2;// -------------------- - ---------------
Oke, dua tugas penting telah selesai (x, y), (w, h), (vx, vy), (vw, vh) telah dihitung. Pekerjaan berikut ditampilkan
variabel
sDC adalah pegangan perangkat (DC) dari gambar asli. tDC adalah pegangan perangkat sementara dDC dan pegangan perangkat akhir. ,STRETCH_DELETESCANS);StretchBlt(dDC ,0,0,vw,vh,tDC,0,0,w,h,SRCCOPY);
Terakhir, gambar ke area yang ditampilkan:
Misalnya:
BitBlt(GetDC(0),vx,vy,vx+vw,xy+vh,dDC,0,0,SRCCOPY);
2. Jelajah gambar
Pertama tentukan tiga variabel global:
FBeginDragPoint :TPoint; // Catat posisi di mana mouse mulai menyeret FBeginDragSBPoint :TPoint; // Catat posisi "titik tengah" FBeginDrag :boolean; // Apakah "drag" a, b telah dimulai: // "Titik tengah " Lokasi
Ketika tombol kiri mouse diklik, catat posisi mouse dan posisi "titik tengah", dan atur FBeginDrag ke true.
Saat tombol kanan mouse muncul, atur FBeginDrag ke false
Saat mouse bergerak, FBeginDrag dinilai. Jika salah, tidak ada pemrosesan yang dilakukan.
Asumsikan X dan Y adalah posisi mouse saat ini
a=FBeginDragPoint.X-((X-FBeginDragPoint.X)*100) div PZoomb=FBeginDragPoint.Y-((Y-FBeginDragPoint.Y)*100) div PZoom
Terakhir, gunakan gambar yang diperkenalkan di atas untuk memperbesar dan menampilkan gambar
Kiat:
1. Jika gambarnya besar, kesalahan memory overflow akan terjadi saat menggunakan objek bitmap delphi. Dalam hal ini, Anda dapat membuat pengaturan berikut:
bitImage:=TBitmap.Buat; bitImage.PixelFormat:=pf24bit;
2. Jika Anda ingin gambar secara otomatis menyesuaikan dengan ukuran jendela, lihat kode berikut:
var p1,p2 :ganda;mulai p1:=pw/sw; p2:=ph/sw; jika p1>p2 maka PZoom:=Bulat(p2*100) lain PZoom:=Bulat(p1*100); 0 lalu PZoom:=100;akhir;
Pemrosesan kecerahan warna piksel gambar skala abu-abu Delphi
Dalam pengolahan gambar, kecepatan merupakan hal yang penting. Oleh karena itu, kita harus memproses ulang TBitmap untuk mendapatkan TVczhBitmap. Ini hanya karena GetPixels dan SetPixels terlalu lambat, jadi kita perlu menggunakan cara lain.
unit untBitmapProc; antarmuka menggunakan Grafik, SysUtils; tipe TVczhBitmap=class(TBitmap) private Data:PByteArray; procedure SetBytes(X,Y:Integer;Value :Byte); fungsi GetBytes(X,Y:Integer):Byte; konstruktor terbitan yang dilindungi Buat; properti publik Bytes[X,Y:Integer]:Byte baca GetBytes tulis SetBytes; prosedur LoadFromFile(FileName:String); prosedur implementasi ToGray; TVczhBitmap.GetBytePointer(X,Y:Integer):PByte; dimulai jika Line<>Y lalu mulai Baris:=Y; Data:=ScanLine[Y]; akhir; Longint(hasil):=Longint(Data)+X; prosedur TVczhBitmap.SetBytes(X,Y:Integer;Nilai:Byte); X,Y)^:=Nilai; akhir; fungsi TVczhBitmap.GetBytes(X,Y:Integer):Byte dimulai hasil:=GetBytePointer(X,Y)^; end; procedure TVczhBitmap.Create; ; Baris:=-1; akhir; prosedur TVczhBitmap.ToGray; B:Byte; mulai untuk Y:=0 hingga Tinggi-1 lakukan untuk X:=0 hingga Lebar-1 lakukan mulai R:=0; untuk B:=0 hingga 2 lakukan R:=R+GetBytes(X*3+ B,Y); untuk B:=0 hingga 2 lakukan SetBytes(X*3+B,Y,R div 3 akhir;
Setelah ini, kita perlu membuat beberapa form. Yang pertama digunakan untuk menampilkan gambar, dan yang kedua digunakan untuk memproses gambar. Semua bentuk lainnya mewarisi dari bentuk kedua dan berisi metode pemrosesan sebenarnya.
Mari kita lihat jendela kedua terlebih dahulu:
unit untProc; antarmuka menggunakan Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir, Dialog, ExtCtrls, untBitmapProc, StdCtrls, ComCtrls ketik TfrmProcessor = class(TForm) pbBar: TPaintBox; prosedur FormCreate(Pengirim: TObject); prosedur FormDestroy(Pengirim: TObject); prosedur FormShow(Pengirim: TObject); prosedur pbBarPaint(Pengirim: TObject); prosedur Button1Click(Pengirim: TObject); ..255]dari Byte; implementasi {$R *.dfm} menggunakan untViewer; prosedur TfrmProcessor.DrawBar; var I:Integer; mulai Bar.Canvas.FillRect(Bar.Canvas.ClipRect); I:=1 hingga 255 lakukan prosedur Bar.Canvas.LineTo(I,255-BarData[I]); TfrmProcessor.FormCreate(Pengirim: TObject); mulai Bar:=TVczhBitmap.Create; Bar.Lebar:=256; =bsSolid; akhir; prosedur TfrmProcessor.FormDestroy(Pengirim: TObject mulai Bar.Gratis; akhir; prosedur TfrmProcessor.FormShow(Pengirim: TObject); var I:Integer; mulai untuk I:=0 hingga 255 lakukan BarData[I]:=I; prosedur TfrmProcessor.pbBarPaint(Pengirim: TObject); .Canvas.Draw(0,0,Bar); akhir; prosedur TfrmProcessor.Button1Click(Pengirim: TObject); var X,Y:Integer; mulai untuk Y:=0 hingga Buffer.Height-1 lakukan untuk X:=0 hingga Buffer.Width*3-1 lakukan Played.Bytes[X,Y]:=BarData[Buffer.Bytes[ X,Y]]; frmViewer.FormPaint(frmViewer akhir;
Setelah itu, buatlah jendela yang mewarisinya, lalu sesuaikan BarData[] dan tekan Terapkan untuk melihat hasilnya.
Sekarang mulailah memproses gambar. Lihat contoh program untuk efek spesifik.
1. Inversi warna.
Warna gambar skala abu-abu berkisar antara 0 hingga 255, jadi untuk membalikkan warna, kita dapat mengurangi nilai warna dari 255 untuk mendapatkan warna terbalik.
var I:Integer; mulai diwarisi; untuk I:=0 hingga 255 lakukan BarData[I]:=255-I;//Kurangi nilai warna dari 255 DrawBar;
2. Persempit rentang warna untuk menambah atau mengurangi kecerahan
Warna aslinya dari 0~255. Jika Anda menyesuaikan rentangnya, misalnya dari 0 hingga 16, gambar akan menjadi lebih gelap secara signifikan. Kita dapat mengatur nilai awal menjadi a dan nilai akhir menjadi b, lalu nilai warna baru New=a+(b-1)*Old/255. Melakukan hal ini akan mengubah kecerahan tanpa merusak urutan warna aslinya. Kodenya adalah sebagai berikut
var I:Integer; mulai untuk I:=0 hingga 255 lakukan BarData[I]:=(255-sbMin.Position)+Round((sbMin.Position-sbMax.Position)/255*I); ); Tombol1Klik(Tombol1);
sbMin.Position dan sbMaxPosition di sini keduanya terbalik. Oleh karena itu, gunakan 255 untuk mengurangi
3. Tingkatkan rentang warna dalam rentang tertentu
Jika gambar itu sendiri memiliki rentang warna yang kecil, Anda dapat menggunakan metode ini untuk meningkatkan kontras gambar, yang bermanfaat untuk analisis gambar. Metode khusus:
Pilih nilai a sebagai nilai awal, pilih nilai b sebagai nilai akhir, lalu ubah bentuknya sesuai dengan rumus berikut:
|.0 (X<=a)
f(X)= |.255/(ba)*(Xa)
|.255(X>=b)
var I:Integer; mulai untuk I:=0 hingga 255 mulai jika I<=sbMin.Position lalu BarData[I]:=0 else jika I>=sbMax.Position lalu BarData[I]:=255 else BarData[I ]:=Bulat(255/(sbMax.Position-sbMin.Position)*(I-sbMin.Position)); pbBarPaint(pbBar); Button1Klik(Tombol1);
4. Ubah menjadi gambar hitam putih
Saat menggunakan fungsi ketiga, Anda akan menemukan bahwa ketika b<=a, warna pada gambar adalah putih kecuali hitam. Manfaat dari operasi ini tidak dapat ditampilkan secara langsung. Ini hanya akan efektif jika menyangkut pemrosesan gambar yang lebih canggih seperti deteksi tepi. Contoh ini dapat ditransformasikan menggunakan rumus cara ketiga, sehingga tidak akan dijelaskan secara detail.
5. Penyesuaian kecerahan eksponensial
Kami berasumsi bahwa domain grafik ini adalah [0,1], dan rentang nilainya juga [0,1]. Kemudian tentukan fungsinya f(x)=x^c, maka bayangan f(x) memiliki bagian seperti gambar di atas. Ketika kita menggunakan mouse untuk beroperasi lagi, kita dapat mengambil titik p (a, b) di atasnya, dan kemudian membuat f (x) melewati titik p, lalu c = ln (b)/ln (a). Dengan C, kita dapat beroperasi dengan warna:
Baru = (lama/255)^C*255 = Exp (ln (lama/255)*c)*255 var ea, EB, EC: Extended; /255; Bardata [i]: = Round (LN ((i/255))*EC)*255);
Melakukan ini menyesuaikan kecerahan gambar.
Tips untuk menampilkan efek khusus di Delphi Graphics
Ringkasan
---- Saat ini, dalam banyak perangkat lunak pembelajaran dan CD game, Anda sering dapat melihat berbagai
Teknologi tampilan grafis bergantung pada gerakan grafis, interlacing, bentuk hujan, tirai, penumpukan blok bangunan dan metode tampilan lainnya untuk membuat gambar lebih hidup dan lebih menarik bagi penonton. Artikel ini akan mengeksplorasi cara menerapkan berbagai teknik tampilan grafis di Delphi.
Prinsip dasar
---- Di Delphi, sangat mudah untuk menampilkan gambar. dan file yang dipilih akan ditampilkan di komponen timage. Tapi ini hanya menampilkan grafik secara langsung dalam bentuk, dan tidak ada keterampilan sama sekali. Untuk membuat tampilan grafis memiliki efek unik, Anda dapat mengikuti langkah -langkah berikut:
---- Tentukan komponen timage, dan muat grafik yang akan ditampilkan ke dalam komponen timage terlebih dahulu, yaitu, muat konten grafik dari disk ke dalam memori sebagai cache grafis.
---- Buat objek bitmap baru dengan ukuran yang sama dengan grafik dalam komponen timage.
'
Konversi konten file menjadi bitmap dan kemudian tampilkan bitmap di formulir.
---- Metode Implementasi
Berbagai teknik tampilan grafis diperkenalkan di bawah ini:
1. Efek penusu
Tarik grafik yang akan ditampilkan ke layar dari atas, ke bawah, kiri, dan arah kanan, dan pada saat yang sama menutupi grafik lama asli di layar. Tarik kiri, dan tarik ke kanan.
Prinsip: Pertama, pindahkan garis horizontal pertama yang ditempatkan dalam grafik sementara ke yang terakhir dalam bitmap yang akan ditampilkan, dan kemudian pindahkan dua garis horizontal pertama dalam grafik sementara ke dua bitmap terakhir yang akan ditampilkan Kemudian pindahkan tiga dan empat baris pertama sampai semua data grafik dipindahkan. Selama proses bergerak, Anda dapat melihat bahwa bitmap yang ditampilkan mengapung dari bawah ke atas, mencapai efek pull-up.
Algoritma Program:
Prosedur TFORM1.BUTTON1CLICK (Pengirim: TOBJEK); : = Image1.height; I: = 0 untuk bmpheight memang memulai newbmp.canvas.copyrect (rect (0, bmpheight-i, bmpwidth, bmpheight), image1.canvas, rect (0,0, bmpwidth, i)); , Newbmp);
2. Efek vertikal terhuyung -huyung
Prinsip: Pisahkan grafik yang akan ditampilkan menjadi dua bagian. Dari layar, Anda dapat melihat bahwa grafik yang lebih ringan muncul di ujung atas dan bawah bergerak ke arah tengah layar sampai benar -benar jelas.
Algoritma Program:
Prosedur TFORM1.BUTTON4CLICK (Pengirim: TOBJEK); ; I: = 0; Sedangkan i <= bmpheight do J: = i; Bmpheight-I+J-1, Bmpwidth, Bmpheight-I+J)); (0, Bmpheight-J, Bmpwidth, Bmpheight-J+1), Image1.Canvas, Rect (0, IJ, Bmpwidth, I-J+1)); (120.100, newbmp);
3. Efek horizontal terhuyung -huyung
Prinsip: Prinsip yang sama dengan efek interlacing vertikal, kecuali bahwa grafik dibagi menjadi dua kelompok dipindahkan ke layar dari ujung kiri dan kanan masing -masing.
Algoritma Program:
Prosedur Tform1.Button5Click (pengirim: TOBJECT); ; i: = 0; sementara saya <= bmpwidth mulai j: = i; sementara j> 0 memang memulai newbmp.canvas.copyrect (rect (j-1,0, j, bmpheight), gambar1.canvas, rect (bmpwidth- i+j-1,0, bmpwidth-i+j, bmpheight)); (BMPWIDTH-J, 0, BMPWIDTH-J+1, Bmpheight), Image1.Canvas, Rect (IJ, 0, I-J+1, Bmpheight)); (120.100, newbmp);
4. Efek Raindrop
Prinsip: Pindahkan garis pemindaian terakhir dari grafik sementara ke garis pemindaian pertama ke bitmap yang terlihat secara berurutan, memungkinkan garis pemindaian ini untuk meninggalkan jejaknya di layar. Kemudian, garis pemindaian kedua dari grafik sementara dipindahkan ke garis pemindaian pertama ke kedua dari bitmap yang terlihat secara berurutan. Dan seterusnya untuk garis pemindaian yang tersisa.
Algoritma Program:
Prosedur Tform1.Button3Click (pengirim: TOBJECT); ; untuk i: = bmpheight downto 1 do for j: = 1 to i do art newbmp.canvas.copyrect (rect (0, j-1, bmpwidth, j), image1.canvas, rect (0, i-1, bmpwidth, i);
5. Efek Louvres
Prinsip: Bagi data yang ditempatkan dalam grafik sementara menjadi beberapa kelompok, dan kemudian memindahkannya secara berurutan dari grup pertama ke grup terakhir. Waktu Pindahkan garis pemindaian kedua, lalu pindahkan garis pemindaian ketiga dan keempat.
Algoritma Program:
Prosedur Tform1.Button6Click (pengirim: TOBJECT); Tinggi: = Image1.height; BMPWIDTH: = Image1.width; -1, bmpwidth, xcount*j+i), image1.canvas, Rect (0, XCount*J+I-1, BMPWIDTH, XCOUNT*J+I));
6. Efek blok bangunan
Prinsip: Ini adalah variasi dari efek hujan.
Algoritma Program:
Prosedur TFORM1.BUTTON7CLICK (Pengirim: TOBJEK); ; I: = Bmpheight; Sedangkan i> 0 Mulai untuk J: = 10 untuk saya mulai newbmp.canvas.copyrect (rect (0, J-10, bmpwidth, j), Image1.canvas, Rect (0, I-10 , bmpwidth, i)); akhir;
Kesimpulan
Efek tampilan grafis di atas semuanya telah diteruskan pada komputer. Ini bekerja dengan baik.
Menerapkan pembesar gambar menggunakan delphi
Tambahkan dua komponen timage ke formulir. Komponen timage lain memiliki properti namanya yang diatur ke Image2, yang menampilkan gambar yang diperbesar.
Inti dari contoh ini adalah fungsi StretchBlt.
Prosedur tform1.image1mouseMove (pengirim: tobject; shift: tshiftate; x, y: integer); begin stretchblt (gambar2.canvas.handle, 0,0, gambar2.width, image2.height, image1.canvas.handle ,, y- 20,40,40, SRCCOPY); Screen.cursors [1]: = LoadCursorFromFile ('magnify.cur');
Program ini pertama -tama akan memanggil fungsi StretchBlt, menggunakan posisi mouse saat ini sebagai titik tengah, pilih gambar parsial pada komponen Image1 dengan panjang samping 40, dan memperbesar gambar parsial ke komponen Image2. Kemudian refresh tampilan komponen Image2 dengan memanggil metode refresh dari komponen Image2. Akhirnya atur pointer mouse ke bentuk baru.
Kode programnya adalah sebagai berikut:
Unit1; InterfaceuseSwindows, pesan, sysutils, varian, kelas, grafik, kontrol, formulir, dialog, extctrls, stdctrls; Type TForm1 = class (tform) Image1: Timage; ; FormMouseMove (pengirim: Tobject; shift: tshiftate ;; shift: tshiftstate; x, y: integer); BeginstretchBlt (Image2.Canvas.handle, 0,0, Image2.width, Image2.Height, Image1.Canvas.handle, X-20, Y-20,40,40, SRCCOPY); ]: = LoadCursorFromFile ('magnify.cur'); Self.cursor: = 1; end; Prosedur tForm1.FormMouseMove (pengirim: TOBJEK; SHIFT: TSHIFTSTATE; X, Y: Integer); BEGIN SCREEN.CURSOR [1]: = CRDEFAULT; .
Simpan file dan kemudian tekan tombol F9 untuk menjalankan program dan program akan berjalan.
Gambar pembesar adalah fungsi penting dari perangkat lunak tampilan gambar yang sangat baik.
Saya harap artikel ini bermanfaat untuk pemrograman Delphi semua orang.