请求协助编写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
相关产品推荐
相关产品推荐

