Python+OpenCV怎么实现多张png透明图像叠加在jpg图像上?? 就和这张图片一样 多张png叠加在jpg图片上
Python+OpenCV怎么实现多张png透明图像叠加在jpg图像上??
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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)])
解决 无用评论 打赏 举报
悬赏问题
- ¥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命令做一个通话软件,播放录音