加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 围绕位图调整画布大小?

发布时间:2020-12-15 09:29:49 所属栏目:大数据 来源:网络整理
导读:以下图片我将用于以下示例: 未加工的尺寸目前为96 x 71 让我们说我想将画布调整为115 x 80 – 结果图像应该是: 最后,如果我将其调整为比原始画布更小的尺寸,例如45 x 45,输出将如下所示: 这是我到目前为止所尝试的: procedure ResizeBitmapCanvas(Bitmap
以下图片我将用于以下示例:

未加工的尺寸目前为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,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回答说,该代码已经过调整/修改.

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

解决方法

我认为这就是你要找的东西:

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,W,H));
    Bmp.Canvas.CopyRect(Dest,Source);
    Bitmap.Assign(Bmp);
  finally
    Bmp.Free;
  end;
end;

我不记得XE是否支持为TRect设置宽度和高度.如果没有,则将代码更改为

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

等等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读