hb12475 2022-02-13 14:24 采纳率: 16.7%
浏览 735
已结题

Python+OpenCV怎么实现多张png透明图像叠加在jpg图像上??

Python+OpenCV怎么实现多张png透明图像叠加在jpg图像上?? 就和这张图片一样 多张png叠加在jpg图片上

img

  • 写回答

14条回答 默认 最新

  • 东方佑 2022-02-20 15:15
    关注
    获得13.00元问题酬金

    import cv2
    import numpy as np
    def gen_png_to_jpg(png_path,jpg_path,png_size=(),jpg_size=(),png_in_jpg_p=(0,0),out_path="",show=True):
        png_image = cv2.imread(png_path, cv2.IMREAD_UNCHANGED)
        jpg_image = cv2.imread(jpg_path, cv2.IMREAD_UNCHANGED)
        if jpg_size:
            jpg_image=cv2.resize(jpg_image,jpg_size)
        a_mask = png_image[:, :, -1]
        x, y = np.where(a_mask == 255)
        x_min = min(x)
        x_max = max(x)
        y_min = min(y)
        y_max = max(y)
        # 裁剪到最小
        new_png = png_image[x_min:x_max, y_min:y_max, :3].copy()
        new_mask = png_image[x_min:x_max, y_min:y_max, -1:].copy()
        if png_size:
            new_png=cv2.resize(new_png, png_size)
            new_mask=cv2.resize(new_mask,png_size)
            new_mask=new_mask.reshape(new_mask.shape[0],new_mask.shape[1],1)
        re_mask = (~new_mask == 255)
        if png_in_jpg_p[0]+re_mask.shape[1]<jpg_image.shape[1] or png_in_jpg_p[1]+re_mask.shape[0]<jpg_image.shape[0]:
    
    
            jpg_image[png_in_jpg_p[1]:re_mask.shape[0]+png_in_jpg_p[1], png_in_jpg_p[0]:re_mask.shape[1]+png_in_jpg_p[0], :] *= re_mask
            jpg_image[png_in_jpg_p[1]:re_mask.shape[0]+png_in_jpg_p[1], png_in_jpg_p[0]:re_mask.shape[1]+png_in_jpg_p[0], :] += new_png
            if out_path:
                cv2.imwrite(out_path,jpg_image)
            if show:
                cv2.imshow("",jpg_image )
                cv2.waitKey()
    
    def gen_png_to_jpg_p(png_path,jpg_path,png_size=(),jpg_size=(),png_in_jpg_p=(0,0),out_path="",show=True):
        png_image = cv2.imread(png_path, cv2.IMREAD_UNCHANGED)
        if type(jpg_path)==type(""):
            jpg_image = cv2.imread(jpg_path, cv2.IMREAD_UNCHANGED)
        else:
            jpg_image=jpg_path
        if jpg_size:
            jpg_image=cv2.resize(jpg_image,jpg_size)
        a_mask = png_image[:, :, -1]
        x, y = np.where(a_mask == 255)
        x_min = min(x)
        x_max = max(x)
        y_min = min(y)
        y_max = max(y)
        # 裁剪到最小
        new_png = png_image[x_min:x_max, y_min:y_max, :3].copy()
        new_mask = png_image[x_min:x_max, y_min:y_max, -1:].copy()
        if png_size:
            new_png=cv2.resize(new_png, png_size)
            new_mask=cv2.resize(new_mask,png_size)
            new_mask=new_mask.reshape(new_mask.shape[0],new_mask.shape[1],1)
        re_mask = (~new_mask == 255)
        if png_in_jpg_p[0]+re_mask.shape[1]<jpg_image.shape[1] or png_in_jpg_p[1]+re_mask.shape[0]<jpg_image.shape[0]:
    
    
            jpg_image[png_in_jpg_p[1]:re_mask.shape[0]+png_in_jpg_p[1], png_in_jpg_p[0]:re_mask.shape[1]+png_in_jpg_p[0], :] *= re_mask
            jpg_image[png_in_jpg_p[1]:re_mask.shape[0]+png_in_jpg_p[1], png_in_jpg_p[0]:re_mask.shape[1]+png_in_jpg_p[0], :] += new_png
            if out_path:
                cv2.imwrite(out_path,jpg_image)
            if show:
                cv2.imshow("",jpg_image )
                cv2.waitKey()
        return jpg_image
    def gen_pngs_to_jpg(jpg_path,png_path_list,png_size_list=None,jpg_size=(),png_in_jpg_p_list=None,out_path="",show=True):
    
        for i,png_path in enumerate(png_path_list):
            jpg_path=gen_png_to_jpg_p(png_path=png_path,jpg_path=jpg_path,jpg_size=jpg_size,png_size=png_size_list[i], png_in_jpg_p=png_in_jpg_p_list[i],out_path="",show=False)
            if show:
                cv2.imshow("",jpg_path)
                cv2.waitKeyEx()
        if out_path:
            cv2.imwrite(out_path,jpg_path)
    
    
    
    
    if __name__ == '__main__':
        # gen_png_to_jpg("457788647446175.png","837709647446145.jpg",png_in_jpg_p=(1,50))
        gen_pngs_to_jpg("837709647446145.jpg",png_path_list=["457788647446175.png","457788647446175.png"],jpg_size=(),png_size_list=[(100,50),(100,50)],png_in_jpg_p_list=[(1,50),(103,50)])
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 2月21日
  • 赞助了问题酬金40元 2月13日
  • 赞助了问题酬金10元 2月13日
  • 赞助了问题酬金10元 2月13日
  • 展开全部

悬赏问题

  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音