¿Cambiar el tamaño del lienzo alrededor de un mapa de bits?

Toma la imagen de abajo que usaré para los siguientes ejemplos:

Las dimensiones no registradas son actualmente.96 x 71

Digamos que quería cambiar el tamaño del lienzo para115 x 80 - La imagen resultante debe ser:

Finalmente, si lo redimensioné a un tamaño más pequeño que el lienzo original, por ejemplo45 x 45 La salida se vería así:

Esto es lo que he intentado hasta ahora:

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;

Si prueba lo anterior en un mapa de bits cargado en un TImage, el mapa de bits real no se centra, sin embargo, el lienzo cambia de tamaño.

Las propiedades que he establecido para la imagen son:

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

Creo que podría ser la línea.Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2); ¿Qué hay que mirar para calcular la posición central correcta?

El código ha sido adaptado / modificado ligeramente de una pregunta reciente que respondió David Heffernan.

¿Cómo puedo cambiar el tamaño del lienzo que rodea un mapa de bits, pero sin estirar el mapa de bits?

Respuestas a la pregunta(1)

Su respuesta a la pregunta