Größe der Arbeitsfläche um eine Bitmap ändern?

Nehmen Sie das folgende Bild, das ich für die folgenden Beispiele verwenden werde:

Die Dimensionen sind derzeit ungeprüft96 x 71

Nehmen wir an, ich wollte die Leinwandgröße ändern115 x 80 - Das resultierende Bild sollte dann sein:

Schließlich, wenn ich es auf eine kleinere Größe als die ursprüngliche Leinwand geändert habe, z45 x 45 Die Ausgabe würde so aussehen:

Das habe ich bisher versucht:

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;

Wenn Sie die obigen Schritte für eine in ein TImage geladene Bitmap ausführen, wird die tatsächliche Bitmap nicht zentriert, die Zeichenfläche ändert jedoch die Größe.

Die Eigenschaften, die ich für das Bild festgelegt habe, sind:

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

Ich denke, es könnte die Linie seinDest.Offset(Bitmap.Width div 2, Bitmap.Height div 2); welche muss man sich anschauen, um die richtige mittenposition zu berechnen?

Der Code wurde aufgrund einer kürzlich von David Heffernan beantworteten Frage leicht angepasst / modifiziert.

Wie ändere ich die Größe der Zeichenfläche, die eine Bitmap umgibt, ohne die Bitmap zu dehnen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage