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

请求协助编写JES中图像叠加及图像文字添加代码

JES图像处理:缩放、叠加与文字添加完整实现

先把你那半完成的缩放函数补全!我猜你是想用最近邻插值(简单易实现,适配JES的基础操作逻辑),下面是完整可运行的版本,关键步骤都加了注释:

def scale(picture, factor):
    # 计算新图像的宽高,+1是避免小数取整后丢失边缘像素
    newHeight = int(factor * getHeight(picture)) + 1
    newWidth = int(factor * getWidth(picture)) + 1
    returnPic = makeEmptyPicture(newWidth, newHeight)
    
    # 遍历新图像的每个目标像素
    for tx in range(newWidth):
        for ty in range(newHeight):
            # 计算对应原图像的源像素坐标(最近邻:直接取整映射)
            sx = int(tx / factor)
            sy = int(ty / factor)
            # 确保坐标不超出原图像的边界
            sx = min(sx, getWidth(picture) - 1)
            sy = min(sy, getHeight(picture) - 1)
            # 复制原像素颜色到新图像对应位置
            sourcePixel = getPixel(picture, sx, sy)
            targetPixel = getPixel(returnPic, tx, ty)
            setColor(targetPixel, getColor(sourcePixel))
    return returnPic

接下来是带透明度调节的图像叠加函数,能让你把一张图叠到另一张上面,还能控制叠加层的透明程度(0=完全透明,1=完全不透明):

def overlayPictures(basePic, overlayPic, opacity, x=0, y=0):
    overlayWidth = getWidth(overlayPic)
    overlayHeight = getHeight(overlayPic)
    
    # 遍历叠加图的每个像素
    for overlayX in range(overlayWidth):
        for overlayY in range(overlayHeight):
            # 计算在底图上的对应位置,超出边界就跳过
            baseX = x + overlayX
            baseY = y + overlayY
            if baseX >= getWidth(basePic) or baseY >= getHeight(basePic):
                continue
            
            # 获取两个像素的RGB颜色值
            basePixel = getPixel(basePic, baseX, baseY)
            overlayPixel = getPixel(overlayPic, overlayX, overlayY)
            
            baseR, baseG, baseB = getRed(basePixel), getGreen(basePixel), getBlue(basePixel)
            overlayR, overlayG, overlayB = getRed(overlayPixel), getGreen(overlayPixel), getBlue(overlayPixel)
            
            # 按透明度混合颜色:结果 = 底图*(1-透明度) + 叠加图*透明度
            newR = int(baseR * (1 - opacity) + overlayR * opacity)
            newG = int(baseG * (1 - opacity) + overlayG * opacity)
            newB = int(baseB * (1 - opacity) + overlayB * opacity)
            
            # 设置混合后的颜色到底图
            setColor(basePixel, makeColor(newR, newG, newB))
    return basePic

最后是图像添加文字的函数,支持自定义字体大小、颜色,还能自动根据图像尺寸缩放文字:

def addTextToPicture(picture, text, x, y, fontSize=12, textColor=makeColor(0,0,0), scaleText=False):
    # 如果开启自动缩放,按图像宽度的1/20调整字体大小(比例可自行修改)
    if scaleText:
        fontSize = int(getWidth(picture) / 20)
    
    # 创建字体对象(第三个参数True是加粗,False是常规)
    font = makeFont("Arial", fontSize, True)
    # 在图像上绘制文字
    drawString(picture, text, x, y, textColor, font)
    return picture

完整使用示例

把这些函数放一起,用下面的主函数就能快速测试:

def main():
    # 加载底图和叠加图(会弹出文件选择窗口)
    basePic = makePicture(pickAFile())
    overlayPic = makePicture(pickAFile())
    
    # 把叠加图缩到原来的0.5倍
    scaledOverlay = scale(overlayPic, 0.5)
    
    # 将缩放后的图叠到底图的(50,50)位置,透明度设为0.6
    finalPic = overlayPictures(basePic, scaledOverlay, 0.6, 50, 50)
    
    # 添加自动缩放的白色文字
    finalPic = addTextToPicture(finalPic, "我的合成图像", 100, 100, scaleText=True, textColor=makeColor(255,255,255))
    
    # 显示最终效果
    show(finalPic)

# 运行主函数
main()

小提示

  • 缩放函数用的是最近邻插值,优点是速度快,缺点是放大后会有锯齿;如果想要更平滑的效果,可以改成双线性插值,但JES里实现起来会复杂一些,这个版本足够日常使用。
  • 叠加时的x、y参数是叠加图左上角在底图上的坐标,你可以根据需求调整位置。
  • drawString的y坐标是文字的基线位置,不是顶部,所以想要文字靠上显示的话,y值要设置小一点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:26