Изменить размер холста вокруг растрового изображения?

Take the below image I will use for the following examples:

Размеры без изменений в настоящее время96 x 71

enter image description here

Допустим, я хотел изменить размер холста, чтобы115 x 80 - итоговое изображение должно быть:

enter image description here

Наконец, если я изменил его размер до меньшего размера, чем у оригинального холста, например45 x 45 вывод будет выглядеть так:

enter image description here

This is what I have tried so far:

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;

Если вы попробуете выше на растровом изображении, загруженном в TImage, фактическое растровое изображение не отцентрируется, однако холст изменит размер.

Свойства, которые я установил для изображения:

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

Я думаю, что это может быть линияDest.Offset(Bitmap.Width div 2, Bitmap.Height div 2); на что нужно смотреть, чтобы рассчитать правильную центральную позицию?

Код был немного адаптирован / изменен по недавнему вопросу Дэвида Хеффернана.

How do I resize the canvas that surrounds a bitmap, but without stretching the bitmap?

Ответы на вопрос(1)

Ваш ответ на вопрос