Zmień rozmiar płótna wokół mapy bitowej?

Skorzystaj z poniższego obrazu, którego użyję do następujących przykładów:

Obecnie są niezmienione wymiary96 x 71

Powiedzmy, że chciałem zmienić rozmiar płótna na115 x 80 - wynikowy obraz powinien być wtedy:

Ostatecznie, jeśli zmieniłem jego rozmiar na mniejszy niż oryginalny obszar roboczy, np45 x 45 wynik będzie wyglądał tak:

Oto, co próbowałem dotychczas:

procedure ResizeBitmapCanvas(Bitmap: TBitmap; H, W: Integer);
var
  Bmp: TBitmap;
  Source, Dest: TRect;
begin
  Bmp := TBitmap.Create;
  try
    Source := Rect(0, 0, Bitmap.Width, Bitmap.Height);
    Dest := Source;
    Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2);
    Bitmap.SetSize(W, H);
    Bmp.Assign(Bitmap);
    Bmp.Canvas.FillRect(Source);
    Bmp.Canvas.CopyRect(Dest, Bitmap.Canvas, Source);
    Bitmap.Assign(Bmp);
  finally
    Bmp.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ResizeBitmapCanvas(Image1.Picture.Bitmap, 110, 110);
end;

Jeśli spróbujesz powyższego na bitmapie załadowanej do TImage, rzeczywista bitmapa nie wyśrodkuje się, ale płótno zmieni rozmiar.

Właściwości, które ustawiłem dla obrazu, to:

Image1.AutoSize := True;
Image1.Center   := True;
Image1.Stretch  := False;

Myślę, że to może być liniaDest.Offset(Bitmap.Width div 2, Bitmap.Height div 2); który wymaga sprawdzenia, aby obliczyć prawidłową pozycję środkową?

Kod został nieznacznie zaadaptowany / zmodyfikowany na podstawie ostatniego pytania, na które odpowiedział David Heffernan.

Jak zmienić rozmiar płótna otaczającego bitmapę, ale bez rozciągania mapy bitowej?

questionAnswers(1)

yourAnswerToTheQuestion