Search code examples
delphibitmapcroptbitmap

Delphi - how do I crop a bitmap "in place"?


If I have a TBitmap and I want to obtain a cropped image from this bitmap, can I perform the cropping operation "in place"? e.g. if I have a bitmap that is 800x600, how can I reduce (crop) it so that it contains the 600x400 image at the centre, i.e. the resulting TBitmap is 600x400, and consists of the rectangle bounded by (100, 100) and (700, 500) in the original image?

Do I need to go via another bitmap or can this operation be done within the original bitmap?


Solution

  • You can use the BitBlt function

    try this code.

    procedure CropBitmap(InBitmap, OutBitMap : TBitmap; X, Y, W, H :Integer);
    begin
      OutBitMap.PixelFormat := InBitmap.PixelFormat;
      OutBitMap.Width  := W;
      OutBitMap.Height := H;
      BitBlt(OutBitMap.Canvas.Handle, 0, 0, W, H, InBitmap.Canvas.Handle, X, Y, SRCCOPY);
    end;
    

    and you can use in this way

    Var
      Bmp : TBitmap;
    begin
      Bmp:=TBitmap.Create;
      try
        CropBitmap(Image1.Picture.Bitmap, Bmp, 10,0, 150, 150);
        //do something with the cropped image
        //Bmp.SaveToFile('Foo.bmp');
      finally
       Bmp.Free;
      end;
    end;
    

    If you want use the same bitmap, try this version of the function

    procedure CropBitmap(InBitmap : TBitmap; X, Y, W, H :Integer);
    begin
      BitBlt(InBitmap.Canvas.Handle, 0, 0, W, H, InBitmap.Canvas.Handle, X, Y, SRCCOPY);
      InBitmap.Width :=W;
      InBitmap.Height:=H;
    end;
    

    And use in this way

    Var
     Bmp : TBitmap;
    begin
        Bmp:=Image1.Picture.Bitmap;
        CropBitmap(Bmp, 10,0, 150, 150);
        //do somehting with the Bmp
        Image1.Picture.Assign(Bmp);
    end;