You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中以参考点为基准缩放并叠加两张Bitmap图片

解决方案

1. 计算缩放比例

首先提取两张图片中线段的端点坐标,用欧几里得距离公式分别计算线段长度,再算出bmpB需要的等比例缩放系数:

  • 设bmpA的线段端点为 (x1,y1) 和 (x2,y2),长度为 lenA = sqrt((x2-x1)² + (y2-y1)²)
  • 设bmpB的线段端点为 (x3,y3) 和 (x4,y4),长度为 lenB = sqrt((x4-x3)² + (y4-y3)²)
  • 缩放比例 scale = lenA / lenB(必须等比例缩放,防止图形扭曲)

2. 缩放bmpB

根据计算出的比例对bmpB进行高质量缩放,以下是不同语言的典型实现:

Python(PIL库)

from PIL import Image
import math

# 假设已获取端点坐标和bmpA的线段长度lenA
pointB1 = (x3, y3)
pointB2 = (x4, y4)
lenB = math.hypot(pointB2[0] - pointB1[0], pointB2[1] - pointB1[1])
scale = lenA / lenB

# 用LANCZOS算法高质量缩放
bmpB_scaled = bmpB.resize(
    (int(bmpB.width * scale), int(bmpB.height * scale)),
    Image.Resampling.LANCZOS
)

C#(GDI+)

using System.Drawing;

// 计算缩放比例
float lenA = (float)Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));
float lenB = (float)Math.Sqrt(Math.Pow(x4 - x3, 2) + Math.Pow(y4 - y3, 2));
float scale = lenA / lenB;

// 创建缩放后的Bitmap并设置高质量插值
Bitmap bmpB_scaled = new Bitmap((int)(bmpB.Width * scale), (int)(bmpB.Height * scale));
using (Graphics g = Graphics.FromImage(bmpB_scaled))
{
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    g.DrawImage(bmpB, 0, 0, bmpB_scaled.Width, bmpB_scaled.Height);
}

3. 对齐线段并叠加

缩放完成后,将bmpB的线段与bmpA的线段完全重合,步骤如下:

  1. 计算偏移量:以bmpA的线段起点(x1,y1)为基准,计算缩放后bmpB起点的偏移值:
    offsetX = x1 - (x3 * scale)
    offsetY = y1 - (y3 * scale)
  2. 将缩放后的bmpB按偏移量叠加到bmpA上,支持透明叠加(如果图片带Alpha通道)。

Python示例

# 创建与bmpA尺寸一致的透明画布
result = Image.new('RGBA', bmpA.size, (0, 0, 0, 0))
# 粘贴底层bmpA
result.paste(bmpA, (0, 0))
# 粘贴缩放后的bmpB,应用偏移量并保留透明通道
result.paste(bmpB_scaled, (int(offsetX), int(offsetY)), mask=bmpB_scaled)

注意事项

  • 如果两条线段方向不同,需先通过向量点积计算夹角,对bmpB进行旋转后再缩放对齐,旋转角度公式:theta = arccos( (向量A · 向量B) / (lenA * lenB) )
  • 图像坐标系以左上角为原点,y轴向下,计算坐标时需注意方向
  • 缩放时优先选择高质量插值算法,避免图像失真模糊

内容的提问来源于stack exchange,提问作者Christian Cascone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 02:50:29