python 两张图片合成一张图片,并在指定位置加入文字

背景:开发要实现一个功能,类似做一个淘宝的合成图片,把一个图片放到另一个图片的部分区域,两个图片合成一张图片,在合成的图片上面,插入一段描述性的语句.实现步骤如下:

1两张图片合成一张,因为图片2比图片1还要大,所以要压缩后再进行合成

# coding:utf-8
"""
author:@
"""
from PIL import Image
import  os
p1=os.path.join(os.path.dirname(__file__),'files','1.png')
p2=os.path.join(os.path.dirname(__file__),'files','2.jpg')
#加载底图
base_img = Image.open(p1)
# 可以查看图片的size和mode,常见mode有RGB和RGBA,RGBA比RGB多了Alpha透明度
print (base_img.size, base_img.mode)
# box = (166, 64, 320, 337)  # 底图上需要P掉的区域
box = (500, 10, 880, 337)  # 底图上需要P掉的区域

#加载需要P上去的图片
tmp_img = Image.open(p2)

"压缩图片"
size =500,250
tmp_img.thumbnail(size)
tmp_img.save("2.jpg",'JPEG')
p3=os.path.join(os.path.dirname(__file__),'2.jpg')
tmp_img = Image.open(p2)
#这里可以选择一块区域或者整张图片
# region = tmp_img.crop((0,0,304,546)) #选择一块区域
#或者使用整张图片
region = tmp_img

#使用 paste(region, box) 方法将图片粘贴到另一种图片上去.
# 注意,region的大小必须和box的大小完全匹配。但是两张图片的mode可以不同,合并的时候回自动转化。如果需要保留透明度,则使用RGMA mode
#提前将图片进行缩放,以适应box区域大小
# region = region.rotate(180) #对图片进行旋转
region = region.resize((box[2] - box[0], box[3] - box[1]))
base_img.paste(region, box)
base_img.show() # 查看合成的图片
base_img.save('out.png') #保存图片




2/图片添加文字,涉及到中文字符的处理,所以会复杂点

# coding=utf-8
# cv2解决绘制中文乱码

import cv2
import numpy
from PIL import Image, ImageDraw, ImageFont


def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
    if (isinstance(img, numpy.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype(
        "C:\\Windows\\Fonts\\msyh.ttf", textSize, encoding="utf-8")
    # 绘制文本
    draw.text((left, top), text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)


if __name__ == '__main__':
    img = cv2ImgAddText(cv2.imread('out.png'), "GTWIN Magnetic Car Ph  Magnetic Car Ph...", 30, 50, (199,40,66), 20)
    cv2.imshow('show', img)
    if cv2.waitKey(100000) & 0xFF == ord('q'):
        cv2.destroyAllWindows()

上面的注释比较详细了

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值