围绕位图调整画布大小?

时间:2012-05-08 17:25:55

标签: delphi delphi-xe

请参考以下图片,我将用于以下示例:

未展开的尺寸目前为96 x 71

enter image description here

假设我想将画布调整为115 x 80 - 生成的图像应为:

enter image description here

最后,如果我将其调整为比原始画布更小的尺寸,例如45 x 45,则输出将如下所示:

enter image description here

这是我到目前为止所尝试的内容:

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中的位图上尝试以上操作,实际的位图不会居中,那么画布确实会改变大小。

我为Image设置的属性是:

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

我认为可能需要查看行Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2);来计算正确的中心位置?

该代码已根据David Heffernan最近回答的问题稍作调整/修改。

如何调整围绕位图的画布,但不拉伸位图?

1 个答案:

答案 0 :(得分: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;

我不记得XE是否支持为Width设置HeightTRect。如果没有,则将代码更改为

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

等等。