Tulisan ini membahas tentang pemotongan sebagian daerah citra (cropping) dengan menggunakan delphi.
berdasarkan komentar di blog
mas, saya mau tanya mengenai penggunaan crop pd photoshop. saya ingin mengcrop beberapa citra dr hasil expose. saya menginginkan hasil dr seluruh citra di-crop dengan width dan height yang sama. berhubung citra yang mau d crop tsb berjumlah ratusan dari setiap hasil expose akan sangat sulit bagi saya untuk mengcrop di tempat yang sama dengan meneliti letaknya terlebih dahulu. hasil2 crop tsb akan saya gunakan sebagai proses untuk pererataan citra dengan software yang telah dibuat.
demikian ptnyaan saya, sekian dan terima kasih.
jawaban saya :
Cara mudahnya jika anda sudah mempunyai lokasi dan dimensi yang sudah tetap :
var srcBitmap, dstBitmap : TBitmap; {...} dstBitmap.Canvas.Draw(-X1, -Y1, srcBitmap);
X1 dan Y1 adalah posisi pada citra asal (srcBitmap) yang ingin anda crop.
dstBitmap diasumsikan sudah berukuran (properti Width dan Height) sesuai dengan yang anda inginkan.
posting di forum delphi-id
Hai smuanya….. ada yang tau nga gimana caranya crop image dari background???
Maskudnya begini….
Misalnya ada objek orang dan backgroundnya warna hijau… trus gimana caranya memisahkan antara orang dengan backgroundnya??? Objek orang akan dipisahkan dan langsung di-crop dari image dan posisi pixel x dan y pun kita ketahui….klo kita crop dengan rectangle berarti ada koordinat dari rectangle tersebut (top,left,right,bottom)…..Mohon bantuannya yah….soalnya dah mentok banget……. Thx….
-RoenZ-
tulisan berikut adalah jawaban saya
asumsi pixelformat = pf24bit
{ tipe data dasar } type TWarnaRGB = packed record b, g, r : byte; end; TArrWarnaRGB = array[0..65535] of TWarnaRGB; PArrRGB = ^TArrWarnaRGB; { fungsi cropping } function GetCropRect(b:TBitmap; BGColor : TWarnaRGB):TRect; j, i : integer; p : PArrRGB; p1, p2 : TPoint; begin { get crop rect } result := Rect(0, 0, 0, 0); p1 := Point(9999, 9999); p2 := Point(-9999, -9999); for j : = 0 to b.Height-1 do begin p := b.scanline[j]; for i := 0 to b.Width-1 do begin if not is_same_color(BGColor, p[i]) then begin { kiri atas } p1 := Point(min2(i, p1.X), min2(j, p1.Y)); { kanan bawah } p2 := Point(max2(i, p2.X), max2(j, p2.Y)); end; end; end; result := Rect(p1.X, p1.Y, p2.X, p2.Y); end; { get cropped bitmap } function CropBitmap(b:TBitmap; cRect:TRect; BGColor : TWarnaRGB):TBitmap; var p1, p2 : PArrRGB; i, j : integer; begin result := TBitmap.Create; result.Width := 1+cRect.Right-cRect.Left; result.Height := 1+cRect.Bottom-cRect.Top; result.PixelFormat := pf24bit; for j : = 0 to result.Height-1 do begin p1 := b.scanline[j+cRect.Top]; p2 := result.scanline[j]; for i := 0 to result.Width-1 do begin if not is_same_color(BGColor, p[i]) then begin p2[i] := p1[i+cRect.Left]; end; end; end; end; { variabel global } var cropRect : TRect; cropBmp : TBitmap; srcBmp : TBitmap; { asumsi sudah ada } BGColor : TWarnaRGB; { main code } begin cropRect := GetCropRect(srcBmp, BGColor); cropBmp := CropBitmap(srcBmp, cropRect, BGColor); end.
Peb makasih yah atas kodenya…. tapi ko pas bagian cRect.w ko error yah???
Oh ya klo pas bagian koordinatnya aja da dimana yah??? x1,y1,x2,y2 doank……
Thx
-RoenZ
hehe.. sorry, my mistake..
tipe TRect di delphi itu field-nya hanya ada top(y1), left(x1), right(x2), sama bottom (y2)
di atur-atur aja.. 😉
waduh bang banyak fungsi yang gak didefenisikan, soalnya new bie banget ni. fungsi2nya yaitu : min2, is_same_color
min2(a, b) : menghasilkan nilai minimum dari dua buah masukan. mengembalikan a jika a < b dan mengembalikan b jika b < a
is_same_color (a, b) : menghasilkan true jika warna a sama dengan warna b. warna a dikatakan sama dengan warna b jika a.r=b.r dan a.g=b.g dan a.b=b.b