**导语:**有时候为了提升效率节省时间,我们需要对文件夹中的图片进行批量处理。由于工作和学习所需,新接触Python,并且实现批量图片操作。
本文处理效果:
以及这样:
正文开始
步骤:实现一张背景图的读取、一个文件夹中尺寸一致或者不一致图像的读取、将读取图片批量替代至背景图的指定位置、将文件夹中的文件名(规范+不规范命名)作为文本写入到背景图的指定位置并以之命名为新的文件、并输出到指定文件夹。
使用的库:OpenCV、Os、PIL、matplotlib.
编程软件:Pycharm、Anaconda等
程序实现的思想:
1、先导入库,确保能够使用相关的功能:
OpenCV:是一个用于图像处理、分析、机器视觉方面的开源函数库。你可以用OpenCV来干什么,以及OpenCV中CV2的用法。
Os:在python编程时,经常和文件、目录打交道,这时就离不了os模块:Python中Os模块的使用。
PIL:该模块就是对图像进行操作的模块,如常见的打开(open)、存储(save)、显示(show)等:Python中PIL类的详细介绍。
Matplotlib:是 Python 2D 绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。Python中的Matplotlib模块使用。
如果需要对读取的图片统一尺寸,可用:
#例如:
img = img1.resize((102,102))
#将图片img1重新设定尺寸为102*102,赋值給img
#同理可以更改102为其他尺寸
2、导入库之后,则需要导入图像文件地址:
3、对图像分别进行操作
4、输出最新图像
#-------------------------------------------------------------------------
先说单张图贴图的实现,文本自定义
背景图:E:/Study of Lab/Test/marro.jpg
需要插入或者代替的图::/Study of Lab/Test/img1_jpg/6.jpg
合成图:
加上字体后:
程序为:
# -*- coding: utf-8 -*-
# by:学不好通信的通信孩子
# time:2021年2月1日
#Python实现将一张图片放到另一张图片指定的位置上并合成一张图
#将文字放入图中的指定位置
import matplotlib.pyplot as plt
from PIL import Image,ImageDraw,ImageFont
import cv2
path = "E:/Study of Lab/Test/marro.jpg"#母图详细文件名以及路径
img = Image.open(path)
# img = qr.make_image(fill_color="#555555", back_color="Red")
#img = img.convert("RGBA") # CMYK/RGBA 转换颜色格式(CMYK用于打印机的色彩,RGBA用于显示器的色彩)
# 添加子图
icon = Image.open("E:/Study of Lab/Test/img1_jpg/6.jpg")#子图文件名
icon = icon.resize((1000,1000))
# 获取图片的宽高取被放图片
img_w, img_h = img.size#获的大小(母图)
print("img_w=", img_w)
print("img_h=", img_h)
icon_w,icon_h=icon.size#获取小图的大小(子图)
factor = 6
size_w = int(img_w / factor)
size_h = int(img_h / factor)
icon_w, icon_h = icon.size
#防止子图尺寸大于母图
if icon_w > size_w:
icon_w = size_w
if icon_h > size_h:
icon_h = size_h
# # 重新设置子图的尺寸
# icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
w = int((img_w - icon_w) / 2)
h = int((img_h - icon_h) / 2)
# 粘贴图片img.paste====替换部分图片==第一个参数用来覆盖的图片
# 第二个参数是要替代的位置
img.paste(icon, (w,h), mask=None)
# 保存图片
img.save("E:/Study of Lab/Test/new.jpg")#合成后的图片路径以及文件名
plt.imshow(icon)
plt.show()
plt.imshow(img)
plt.show()
font = ImageFont.truetype("E:/Study of Lab/Test/cambriaz.ttf",300)
image = Image.open('E:/Study of Lab/Test/new.jpg')
img_draw = ImageDraw.Draw(image)
img_draw.text((1500,1500),'Be Yourself',fill='black',font=font) # 放上文字信息到图像上
#image.show()
image.save("E:/Study of Lab/Test/hecheng.jpg")
#-------------------------------------------------------------------------
如果是批量操作:
(1)命名规范
背景图:E:\Study of Lab\Test\background.jpg
子图文件夹:
运行中显示的处理图像:
输出图为:
加了字体之后:
程序为:
# -*- coding: utf-8 -*-
# by:学不好通信的通信孩子
# time:2021年2月1日
该部分:实现循环读取文件夹中的图片,将图片粘贴到背景图具体位置
import matplotlib.pyplot as plt
import cv2
import os
from PIL import Image,ImageDraw,ImageFont
#os.path.join()函数:连接两个或更多的路径名组件
#链接:https://www.cnblogs.com/an-ning0920/p/10037790.html
# 1.如果各组件名首字母不包含’/’,则函数会自动加上
# 2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃
# 3.如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾
#-------------------------------------------------------------------------------
# 源目录
project_dir = os.path.dirname(os.path.abspath(__file__))
#os.path.abspath(__file__) 作用: 获取当前脚本的完整路径
# 输入目录
input = os.path.join(project_dir, 'img1_jpg')
#path='C:/yyy/yyy_data/'
#print(os.path.join(path,'/abc'))
#C:/abc
# 输出目录
output = os.path.join(project_dir, 'auto_image')
def img_read():#对子图进行操作
# 切换目录
#os.chdir() 方法用于改变当前工作目录到指定的路径
#path -- 要切换到的新路径
os.chdir(input)
# 遍历目录下所有的文件
for filename in os.listdir(os.getcwd()):
print(filename)
path = "E:/Study of Lab/Test/background.jpg" # 母图详细文件名以及路径
img_back = Image.open(path)
img_w, img_h = img_back.size # 获取被放图片的大小(母图)
# 639 959
print("img_w=", img_w)
print("img_h=", img_h)
im = Image.open(os.path.join(input, filename))#子图读取
im = im.resize((1000,1000))
im_w, im_h = im.size
print("im_w=", im_w)
print("im_h=", im_h)
#print("size1=", size1)
if im_w > img_w:
im_w = img_w
if im_h > img_h:
im_h = img_h
w = int(51 * (img_w - im_w) / 90)
h = int(12 * (img_h - im_h) / 150)
print("w等于", w)
print("h等于", h)
# cv2.imshow(filename, im)
print(im.size[0])#352
print(im.size[1])
img_back.paste(im,(w,h),mask=None)
plt.imshow(im)
plt.show()
plt.imshow(img_back)
plt.show()
img_back.save(os.path.join(output, filename))
if __name__ == '__main__':
img_read()
#该部分:实现循环读取文件夹中的图片,将文字写入指定位置
import cv2
import os
from PIL import Image,ImageDraw,ImageFont
#读取嵌入图文件夹下的所有图
#写入字体
def read_image(img_addition):
i = 0
for filename in os.listdir(img_addition): #读取文件名
print(filename)
pict=cv2.imread(img_addition + "/" +filename) #读取到该地址下,带有文件名的图片
font = cv2.FONT_HERSHEY_DUPLEX # 设置字体
# 图片对象、文本、左上角坐标、字体、字体大小、颜色、字体粗细
imgzi = cv2.putText(pict, filename, (1300,1500), font,15, (255, 0, 0), 10 )
cv2.waitKey(0)
cv2.imwrite("E:/Study of Lab/Test/auto_image"+"/"+filename,pict)
i=i+1
print("该文件夹下的图片是",i,"个")
read_image("E:/Study of Lab/Test/auto_image")
同理,子文件夹中命名不规范同样处理。【程序如上,修改子图文件夹即可】
(2)命名不规范
背景图:E:\Study of Lab\Test\background.jpg子图文件夹:
输出图:
参考文献:
https://www.9xkd.com/user/plan-view.html?id=1113747022
创作不易,转载请注明出处。