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

如何实现不同图片中固定位置框的内容替换(文本与签名图像)?

如何批量替换图片中固定位置的文本与签名区域

我来给你几个实用的解决方案,都是实际项目里验证过的,完全能搞定你替换固定位置黄色框(CODICEFISCALE文本)和绿色框(签名图片)的需求。

方案一:Python Pillow库(最灵活,适合批量处理)

Pillow是Python生态里最常用的图像处理库,能轻松实现文本覆盖、图片粘贴的操作,还能批量处理大量图片。

步骤说明:

  1. 先安装依赖:
pip install pillow
  1. 提前获取两个框的精确坐标和尺寸(用画图工具/PS/GIMP都能看,鼠标悬停就显示左上角坐标,再算宽高)。
  2. 编写代码处理:
from PIL import Image, ImageDraw, ImageFont

# ---------------------- 配置参数 ----------------------
# 黄色框(CODICEFISCALE):左上角坐标(x,y) + 宽高(w,h)
codice_area = {"x": 100, "y": 200, "w": 200, "h": 30}
# 绿色框(签名):左上角坐标(x,y) + 宽高(w,h)
firma_area = {"x": 100, "y": 300, "w": 150, "h": 50}
# 数据库取出的税号文本
codice_text = "XYZ123456789"
# 用户签名图片路径
firma_img_path = "user_signature.png"
# 原始模板图片路径
source_img_path = "template.png"
# 输出图片路径
output_img_path = "processed_template.png"
# ------------------------------------------------------

# 打开原始图片和签名图片
with Image.open(source_img_path) as base_img, Image.open(firma_img_path) as firma_img:
    draw = ImageDraw.Draw(base_img)
    
    # 1. 替换CODICEFISCALE:先覆盖黄色框区域
    # 这里用白色填充,如果你需要更自然的背景,可以取框内的平均色
    draw.rectangle(
        [codice_area["x"], codice_area["y"], 
         codice_area["x"]+codice_area["w"], codice_area["y"]+codice_area["h"]],
        fill="white"
    )
    
    # 设置字体(可以换成你需要的字体文件路径)
    try:
        font = ImageFont.truetype("arial.ttf", 24)
    except IOError:
        # 找不到字体就用默认字体
        font = ImageFont.load_default()
    
    # 让文本居中显示在框内
    text_bbox = draw.textbbox((0,0), codice_text, font=font)
    text_w = text_bbox[2] - text_bbox[0]
    text_h = text_bbox[3] - text_bbox[1]
    text_x = codice_area["x"] + (codice_area["w"] - text_w) // 2
    text_y = codice_area["y"] + (codice_area["h"] - text_h) // 2
    draw.text((text_x, text_y), codice_text, font=font, fill="black")
    
    # 2. 替换签名:缩放签名到绿色框尺寸
    resized_firma = firma_img.resize((firma_area["w"], firma_area["h"]))
    # 粘贴签名(如果签名有透明通道,第三个参数保留透明)
    base_img.paste(resized_firma, (firma_area["x"], firma_area["y"]), resized_firma)
    
    # 保存处理后的图片
    base_img.save(output_img_path)

关键提示:

  • 如果模板图片的背景不是白色,你可以用base_img.getpixel((codice_area["x"], codice_area["y"]))取框内的颜色作为填充色,更自然。
  • 批量处理的话,把上面的代码套个循环,遍历所有模板图片路径即可。

方案二:ImageMagick命令行(无需写代码,适合快速批量处理)

如果你不想写代码,ImageMagick这个命令行工具绝对好用,直接通过命令就能完成替换,适合批量脚本处理。

步骤说明:

  1. 先安装ImageMagick(官网下载对应系统版本即可)。
  2. 执行两条命令完成替换:
# 第一步:覆盖黄色框并写入CODICEFISCALE文本
convert template.png \
  -fill white -draw "rectangle 100,200 300,230" \
  -font Arial -pointsize 24 -fill black -draw "text 150,220 'XYZ123456789'" \
  temp.png

# 第二步:粘贴签名到绿色框位置
convert temp.png firma.png \
  -geometry 150x50+100+300 -composite \
  processed_template.png

参数解释:

  • rectangle 100,200 300,230:黄色框的左上角(100,200)到右下角(300,230)。
  • text 150,220:文本的位置(这里取框的中心点)。
  • geometry 150x50+100+300:签名的尺寸150x50,左上角位置(100,300)。

方案三:Web前端Canvas(适合在线生成场景)

如果你的需求是在网页上让用户上传签名、实时生成处理后的图片,用Canvas就能直接在浏览器里完成,不需要后端参与。

<canvas id="imageCanvas" style="display:none;"></canvas>
<button onclick="processImage()">生成处理后的图片</button>

<script>
async function processImage() {
    const canvas = document.getElementById('imageCanvas');
    const ctx = canvas.getContext('2d');
    
    // 1. 加载模板图片
    const templateImg = new Image();
    templateImg.src = 'template.png';
    await new Promise(resolve => templateImg.onload = resolve);
    
    canvas.width = templateImg.width;
    canvas.height = templateImg.height;
    ctx.drawImage(templateImg, 0, 0);
    
    // 2. 替换CODICEFISCALE
    const codiceX = 100, codiceY = 200;
    const codiceW = 200, codiceH = 30;
    // 覆盖黄色框
    ctx.fillStyle = 'white';
    ctx.fillRect(codiceX, codiceY, codiceW, codiceH);
    // 居中写入文本
    ctx.font = '24px Arial';
    ctx.fillStyle = 'black';
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    ctx.fillText('XYZ123456789', codiceX + codiceW/2, codiceY + codiceH/2);
    
    // 3. 替换签名
    const firmaImg = new Image();
    firmaImg.src = 'user_signature.png'; // 可以换成用户上传的签名Blob URL
    await new Promise(resolve => firmaImg.onload = resolve);
    const firmaX = 100, firmaY = 300;
    const firmaW = 150, firmaH = 50;
    ctx.drawImage(firmaImg, firmaX, firmaY, firmaW, firmaH);
    
    // 4. 下载处理后的图片
    const outputUrl = canvas.toDataURL('image/png');
    const downloadLink = document.createElement('a');
    downloadLink.href = outputUrl;
    downloadLink.download = 'processed_image.png';
    downloadLink.click();
}
</script>

通用注意事项:

  • 坐标准确性:一定要精确获取两个框的坐标和尺寸,否则替换位置会偏移。
  • 签名透明:尽量让用户上传带透明背景的PNG签名,这样粘贴后不会覆盖模板的其他内容。
  • 文本适配:如果数据库里的文本长度不一,可以在代码里判断文本宽度,自动调整字体大小,避免超出框的范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:52:28