请参考以下图片,我将用于以下示例:
未展开的尺寸目前为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中的位图上尝试以上操作,实际的位图不会居中,那么画布确实会改变大小。
我为Image设置的属性是:
Image1.AutoSize := True;
Image1.Center := True;
Image1.Stretch := False;
我认为可能需要查看行Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2);
来计算正确的中心位置?
该代码已根据David Heffernan最近回答的问题稍作调整/修改。
如何调整围绕位图的画布,但不拉伸位图?
答案 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
设置Height
和TRect
。如果没有,则将代码更改为
Source.Right := Source.Left + Min(W, Bitmap.Width);
等等。