以下图片我将用于以下示例:
目前,未加工的尺寸 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;
Run Code Online (Sandbox Code Playgroud)
如果您在加载到TImage中的位图上尝试上述实际位图不居中,则画布会改变大小.
我为Image设置的属性是:
Image1.AutoSize := True;
Image1.Center := True;
Image1.Stretch := False;
Run Code Online (Sandbox Code Playgroud)
我认为它可能是Dest.Offset(Bitmap.Width div 2, Bitmap.Height div 2);需要查看的线,以计算正确的中心位置?
最近的问题David Heffernan回答说,该代码已经过调整/修改.
如何调整围绕位图的画布,但不拉伸位图?
我认为这就是你要找的东西:
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;
Run Code Online (Sandbox Code Playgroud)
我不记得,如果XE支持环境Width和Height一个TRect.如果没有,则将代码更改为
Source.Right := Source.Left + Min(W, Bitmap.Width);
Run Code Online (Sandbox Code Playgroud)
等等.
| 归档时间: |
|
| 查看次数: |
8731 次 |
| 最近记录: |