5

次の例で使用する以下の画像を使用します。

現在変更されていない寸法は、96 x 71

ここに画像の説明を入力

キャンバスのサイズを変更したいとしましょう115 x 80-結果の画像は次のようになります。

ここに画像の説明を入力

最後に、元のキャンバスよりも小さいサイズにサイズ変更すると、たとえば45 x 45、出力は次のようになります。

ここに画像の説明を入力

これは私がこれまでに試したことです:

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);正しい中心位置を計算するために、見る必要があるのは線ではないでしょうか?

このコードは、David Heffernan が回答した最近の質問からわずかに変更/修正されています。

ビットマップを引き伸ばすことなく、ビットマップを囲むキャンバスのサイズを変更するにはどうすればよいですか?

4

1 に答える 1

6

これがあなたが探しているものだと思います:

procedure ResizeBitmapCanvas(Bitmap: TBitmap; H, W: Integer; BackColor: TColor);
var
  Bmp: TBitmap;
  Source, Dest: TRect;
  Xshift, Yshift: Integer;
begin
  Xshift := (Bitmap.Width-W) div 2;
  Yshift := (Bitmap.Height-H) div 2;

  Source.Left := Max(0, Xshift);
  Source.Top := Max(0, Yshift);
  Source.Width := Min(W, Bitmap.Width);
  Source.Height := Min(H, Bitmap.Height);

  Dest.Left := Max(0, -Xshift);
  Dest.Top := Max(0, -Yshift);
  Dest.Width := Source.Width;
  Dest.Height := Source.Height;

  Bmp := TBitmap.Create;
  try
    Bmp.SetSize(W, H);
    Bmp.Canvas.Brush.Style := bsSolid;
    Bmp.Canvas.Brush.Color := BackColor;
    Bmp.Canvas.FillRect(Rect(0, 0, W, H));
    Bmp.Canvas.CopyRect(Dest, Bitmap.Canvas, Source);
    Bitmap.Assign(Bmp);
  finally
    Bmp.Free;
  end;
end;

WidthXE が設定をサポートしHeightているかどうかを思い出せませんTRect。そうでない場合は、コードを次のように変更します

Source.Right := Source.Left + Min(W, Bitmap.Width);

等々。

于 2012-05-08T17:32:18.550 に答える