Cropping Bitmap

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.

4 comments

  1. $^$ · Agustus 6, 2007

    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

  2. pebbie · Agustus 7, 2007

    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..😉

  3. evilkyro1965@yahoo.com · Oktober 30, 2007

    waduh bang banyak fungsi yang gak didefenisikan, soalnya new bie banget ni. fungsi2nya yaitu : min2, is_same_color

  4. pebbie · Oktober 30, 2007

    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

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s