如需转载,请注明出处。
更多优质内容,详细测试程序,可点击原文链接进行阅读学习。

功能

合并前景与背景两张图片,可设置图片前景的透明度,缩放因子,位置,可自适应调整背景大小并且输出图片所在边界框位置,用于标注数据

实现

  1. 利用PIL包,将两张图片进行 paste
  2. 通过修改图片 alpha 值,对图片透明度进行修改
  3. 对图片的大小处理,获取最终的图片尺寸
  4. 根据调整后的前景图片尺寸,调整背景的尺寸
  5. 对前景边界框进行处理,得到合理的边界坐标

代码

2022.11.25 修复长宽相反的问题

def xywh2xyxyxyxy(x,y,w,h):return [[x,y],[x+w,y],[x+w,y+h],[x,y+h]]def merge_image(fore_image, back_image, pos=(0,0),alpha=1.0,factor=1.0,padding=False,func=lambda x:x):"""将两个图片进行合并,支持自定义透明度 alpha, 缩放factor, 背景图缩放开关 padding, 前景图回调函数 funcArgs:fore_image (PIL.Image): 前景图back_image (PIL.Image): 背景图pos (tuple, list): 左上角位置. Defaults to (0,0).alpha (float, optional): 前景透明度. Defaults to 1.0.factor (float, optional): 前景缩放因子. Defaults to 1.0.padding (bool, optional): 背景自适应缩放. Defaults to False.func (Functional, optional): 前景处理回调函数. Defaults to lambdax:x.Returns:PIL.Image: 合并后的图片"""assert alpha <= 1.0, "Alpha must be less or equel than 1.0"final_image = back_image.copy() fore_image_temp = fore_image.copy()   # 设置缩放因子 透明度fore_h, fore_w = fore_image_temp.sizeprint(fore_w,fore_h)fore_new_w = int(fore_w / factor)fore_new_h = int(fore_h / factor)for i in range(fore_new_w):for k in range(fore_new_h):color = fore_image_temp.getpixel((i, k))color = color[:-1] + (int((color[-1]*alpha)%255), )fore_image_temp.putpixel((i, k), color)fore_image_temp = fore_image_temp.resize((fore_new_w, fore_new_h), Image.Resampling.LANCZOS)fore_image_temp = func(fore_image_temp)# 背景图不够大将会被resizeif padding:back_limit_w = fore_new_w + pos[0]back_limit_h = fore_new_h + pos[1]else:back_limit_w = fore_new_wback_limit_h = fore_new_h# 设置背景图片大小back_h,back_w = final_image.size# 设置背景图大小if back_w < back_limit_w:back_new_w = back_limit_wprint(f"背景图宽度过小, {back_w} < {back_limit_w}")if back_h < back_limit_h:back_new_h = back_limit_hprint(f"背景图高度过小, {back_h} < {back_limit_h}")final_image = final_image.resize((back_new_w,back_new_h),Image.Resampling.LANCZOS)final_image.paste(fore_image_temp, pos, mask=fore_image_temp)fore_final_h, fore_final_w = fore_image_temp.sizeback_final_h, back_final_w =final_image.sizelabel_x = pos[0] if pos[0]>0 else 0label_y = pos[1] if pos[1]>0 else 0label_w = pos[0]+fore_final_w-label_x if pos[0]+fore_final_w < back_final_w else back_final_w-label_xlabel_h = pos[1]+fore_final_h-label_y if pos[1]+fore_final_h < back_final_h else back_final_h-label_yreturn final_image, xywh2xyxyxyxy(label_x,label_y,label_w,label_h)

演示

【工程应用接口】多张图片合并(python实现)相关推荐

  1. python多张图片合并拼接,python制作sprite图、雪碧图

    python多张图片合并拼接,python制作sprite图.雪碧图 整理图片集 找两个文件夹,yangying和zhaoliying,分别放上照片8张,共16张照片. 创建sprite.py # 多 ...

  2. python多图片合并pdf_Python结合ImageMagick实现多张图片合并为一个pdf文件的方法

    本文实例讲述了Python结合ImageMagick实现多张图片合并为一个pdf文件的方法.分享给大家供大家参考,具体如下: 前段时间买了不少书,现在手头的书籍积累的越来越多,北京这边租住的小屋子空间 ...

  3. 如何简单实现接口自动化测试(基于 python)

    GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python) 关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术 一.简介 本文从一个简单的登录接口测试入 ...

  4. 这12种方法轻松合并Python中的列表

    我喜欢12这个数字,因为有太多的事情与12有关.一年有12个月;古代用12个时辰(地支)表示一天的时间.用一纪表示12年;希腊有12主神;黄道有12宫;撒迦利亚.西琴先生的<地球编年史>中 ...

  5. java 图片合成pdf_java将多张图片合并转为PDF

    所需jar包:com.lowagie.text package weaver.gy.util; import java.awt.image.BufferedImage; import java.io. ...

  6. php 如何让两张图片重叠,php多张图片合并方法分享

    本文主要和大家分享php多张图片合并方法,PHP imagecopymerge 函数可以支持两个图像叠加时,设置叠加的透明度,imagecopy 函数则不支持叠加透明,实际上,PHP内部源码里,ima ...

  7. PDF文件合并 –Python

    PDF 文件合并 – Python 安装 明确目标 Simple case 了解需求 Part I Part II 代码实现 安装 因版本差异,可能会产生报错. Python import platf ...

  8. java 图片合并成pdf_java将多张图片合并转为PDF

    [实例简介] [实例截图] [核心代码] package weaver.gy.util; import java.awt.image.BufferedImage; import java.io.Fil ...

  9. 多张图片合并转为PDF

    需要使用的依赖 <dependency><groupId>com.lowagie</groupId><artifactId>itext</arti ...

  10. 代码 - 多张图片合并成PDF(每页宽高即是当前页面图片的宽高)- itextpdf

    文章目录 1. 多张图片转成PDF(每页PDF的宽高是当前页面图片的宽高) 7.2.3版本 官方示例 多图合并成PDF   1. 多张图片转成PDF(每页PDF的宽高是当前页面图片的宽高) 7.2.3 ...

最新文章

  1. web前端培训:本期教程CSS 三大特性
  2. python123数字形式转换_python基本数据类型的使用、转换----数字(有待完善)
  3. 20)内联函数(其实,我不懂)
  4. 21、深入浅出MFC学习笔记,Application Framework简介
  5. 没人告诉你的小工具整理收藏
  6. [Codeforces673A]Bear and Game(水题,思路)
  7. zabbix 启动报cannot connect to Service Manager: [0x00000005]解决方法
  8. strace实现原理:ptrace系统调用
  9. C++:标准程序库-STL迭代器Iterator
  10. SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”
  11. 鸿蒙系统电脑模拟运行,安卓游戏在鸿蒙运行被识别为PC端模拟器,鸿蒙生态依然欠缺!...
  12. VOC2007/2012数据集解析
  13. esp32单片机入门学习
  14. 2G维码器-以及4G维码器--基于合宙air202 air720sl luat
  15. 太可怕了!人工智能逐渐取代客服?原因竟然是这个
  16. 【应用安全】S-SDLC安全开发生命周期
  17. php黑名单绕过,文件上传漏洞之黑名单检测绕过
  18. Linux之时区修改
  19. hdu1234 开门人与关门人
  20. 【软路由】J4125安装PVE7.3+iKuai+OpenWrt+NAS+Win10+Debian+CentOS

热门文章

  1. 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用
  2. mysql时间戳的使用_如何使用MYSQL时间戳查询时间段
  3. Java面向对象系列[v1.0.0][泛型进阶]
  4. c语言13号星期几,用pascal求这一年中每个月的13号是星期几
  5. 中国平安保险电话车险和网上车险,都是直销模式
  6. 个人对Linux下的QQ聊天工具的总结
  7. mysql 权限命令 revoke_MySQL删除用户权限(REVOKE)
  8. Vimplus安装及常见问题解决
  9. centos配置静态ip重启后无效
  10. css让div旋转,CSS3 transform 属性 旋转 div 元素