围绕位图调整画布大小?

2024-04-02

如下图所示,我将在以下示例中使用它:

目前尺寸未改变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 最近回答的问题进行了轻微调整/修改。

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


我想这就是您正在寻找的:

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 and Height for a TRect。如果没有则将代码更改为

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

等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

围绕位图调整画布大小? 的相关文章

随机推荐

  • C# 中的数字签名,无需使用 BouncyCastle

    不使用第 3 方 BouncyCastle 库 有没有办法读取自定义私钥并签署消息 sha256哈希 使用私钥加密 从技术上来说 是的 根据您拥有的密钥类型 答案会变得更加棘手 编辑 2019 年 10 月 NET Core 3 0 以 D
  • 验证 Base64 编码图像

    我正在构建一个应用程序 允许用户POSTHTML5 画布数据随后以 Base64 进行编码并显示给所有用户 我正在考虑将数据解析为实际的 png 文件并存储在服务器上 但 base64 路由允许我将图像存储在数据库中并最大限度地减少请求 图
  • SQL Server:根据条件查找日期与当前日期最接近的记录

    我正在使用 SQL Server 2012 并尝试创建一个将根据以下条件返回记录的视图 查询需要根据日期检索最适用的记录 对于内部日期范围内的日期 将返回最接近 CurrentDate 的记录 对于内部日期范围之外的日期 将返回最接近 Cu
  • 为什么在 shellcode 中使用 Push/Pop 而不是 Mov 将数字放入寄存器中?

    我有一些来自 shell 代码有效负载的示例代码 显示了 for 循环并使用 push pop 来设置计数器 push 9 pop ecx 为什么不能直接使用mov呢 mov ecx 9 是的 通常你应该总是使用mov ecx 9出于性能原
  • LinkedAuthorizationFailed 在 PowerShell 中意味着什么?

    我正在尝试使用 PowerShell 在 cosmos db 中添加虚拟网络规则 VNETS 存在于不同的租户中 我对存储帐户做了同样的事情 效果很好 我收到以下错误 有人可以给我一些关于我哪里出错的指示吗 是否可以在 Cosmos 数据库
  • eclipse:调试以编程方式启动的进程

    我正在通过 Eclipse 中的另一个 java 进程以编程方式执行 java 进程 Process process Runtime getRuntime exec command envp dir 有没有办法告诉eclipse调试子进程
  • E2009 不兼容的类型:“参数列表不同”

    我收到以下错误 E2009 不兼容的类型 参数列表不同 然而我不同意 看看定义我看不出有什么区别 这是记录定义 type TFastDiv record private DivideFunction function const Buffe
  • 哪种 TypeScript 配置会产生最接近 Node.js 16 功能的输出?

    Node js 16 最近发布 带来了对 ES2021 的更新支持以及对 ES 模块的稳定支持 如何配置 TypeScript 来输出利用所有这些新功能的 JavaScript 代码 从 Node js 开始16 0 0 100 支持ES2
  • 顺利改变CSS

    我的情况如下 我有以下功能 var showHideMemberContent function if isHidden false showHideMemberContent text Member Content main css he
  • 对 Volatile.Read/Write 的理解

    我试图理解 C Volatile 类 正如我读到的 The Volatile Write方法强制写入位置中的值 到呼叫点 此外 任何较早的程序订单 加载和存储必须在调用 Volatile Write 之前发生 The Volatile Re
  • 扩展类型转换器

    DateTimeConverter 类提供 DateTime 和字符串之间的转换 我还想支持 DateTime 和 double 之间的转换 根据 MSDN 我可以扩展 DateTimeConverter 类来执行此操作 请参阅MSDN 日
  • Visual Studio 2015 重置 Web 项目以使用 IIS Express

    我在 VS2015 中有一个 Web 项目 我想在本地 IIS 上运行 我在项目属性中进行了设置 它工作正常 但每当我关闭并重新打开 Visual Studio 时 它总是将项目重置为使用 IIS Express EDIT 当我关闭并重新打
  • opencv - 视频看起来不错,但帧旋转了 90 度

    我们将视频保存在移动客户端上并将其发送到服务器 在服务器上 我使用以下代码来保存帧 gt import skvideo io import cv2 haar home ubuntu opencv data haarcascades haar
  • dapper -multi-mapping:扁平 sql 返回嵌套对象

    我有一家包含地址对象的公司 SQL 返回是平坦的 我试图让 Query 加载所有对象 cnn Query
  • 运行 BLAST (bl2seq) 而不创建序列文件

    我有一个执行 BLAST 查询 bl2seq 的脚本 该脚本的工作原理如下 获取序列a 序列b 将序列a写入文件 将序列b写入文件b 运行命令 bl2seq i filea j fileb nblastn 从 STDOUT 获取输出 解析
  • 为什么使用 ASP.NET 从另一个页面返回后 Page_Load 没有触发 - 因此是史诗般的尴尬:)

    假设我在同一个 ASP NET C 网站上有两个页面 Page1 aspx 在 Page Load 事件中执行操作 我使用菜单导航到 Page2 aspx Page2 aspx 然后做了一些事情响应 重定向返回Page1 aspx Page
  • 在类构造函数中完成类注册后,不调用类构造函数

    我正在编写一个简单的依赖注入 控制反转系统 基于 TDictionary 保存抽象类引用及其各自的实现类 我的目标是 避免按类型直接实例化 显然 将类单元包含在 dpr 中应该足以使其注册并可通过 di ioc 系统进行选择和实例化 声明具
  • Java TreeMap 自定义比较器奇怪的行为

    我正在尝试创建一个Map使用排序键 首先按字母顺序排序 最后按数字排序 为此 我正在使用TreeMap与定制Comparator public static Comparator
  • 将嵌套 html 转换为 bbCode 引用标签

    我正在尝试转换以下html div class bbQuote div class quoteAuthor Joe Block div div class quoteContent This is the first message br
  • 围绕位图调整画布大小?

    如下图所示 我将在以下示例中使用它 目前尺寸未改变96 x 71 假设我想调整画布大小115 x 80 结果图像应该是 最后 如果我将其调整为比原始画布更小的尺寸 例如45 x 45输出将如下所示 这是我到目前为止所尝试过的 procedu