pil(pythonimagelibrary )是python的第三方图像处理库,但由于其强大的功能和众多的用户数量,几乎被认为是python官方图像处理库。 其官方主页为:PIL。
PIL的历史很悠久,原本是只支持python2.x的版本。 之后,移植到python3上的库PILlow问世了。 pillow被称为friendly fork for PIL,其功能与pil几乎相同,但支持python3。 本文只使用PIL最常用的特性和用法,主要从:http://www.effbot.org/imaging book上参考。
Part 1:利用python生成照片墙
)1)简要介绍思路:
(1)根据给定的字符串生成图像
)2)然后,将该图像的各像素的宽度扩展为edge_len倍,高度也扩展为edge_len倍。如果edge_len=60,则原始字符图像的各像素成为60*60像素的一个图像。
)3)原始文字图像的每个像素的透明度不同,显示文字的位置、透明度低(不透明)这两个文字的周边位置、透明度高(透明)的透明)基于原始文字图像的每个像素的透明度,输入到该像素(实际上宽度放大到60倍)图像中
)2)导入库文件
来自pil导入图像,ImageDraw,image字体
导入操作系统
(3)由文字生成图像
defgen_text_img(text,font_size=20,font_path=None ) :
# args :文字内容、文字字体大小、字体路径
font=image font.truetype (font _ path,font_size ) if font_path is not None else None
(width,length )=font.getsize(text ) #获取字符大小
text_img=image.new(rgba ),) width,length ) ) ) ) ) ) ) ) )。
draw=imagedraw.draw(text_img ) )
#第一个tuple表示未知(left,up ),然后设置字符、颜色、最后设置字体
daw.text () 0,0 )、text,fill=)、0,0 )、font=font ) ) ) )。
text_img.save('./temp_pic.jpg ' )
return text_img
)4)透明度调节
eftrans_alpha(img,pixel ) :
''''
基于rgba的pixel调节img的透明度
从这里进来的pixel是四班(r、g、b、阿尔法) )。
''''
_,_,_,阿尔法=img.split (
阿尔法-阿尔法点(lambdaI:pixel(-1 ) *10 ) ) ) ) ) )
img.putalpha (阿尔法) #Part2有介绍
返回img
)5)根据透明度参数用像素覆盖放大文字图
efpicture_wall_mask(text_img,edge_len,pic_dir='./user ' ) :
#根据图文gen_text_img图像生成相应的照片墙,输入:图文、每张照片边长、有照片的路径
new_img=image.new(rgba ),) text_img.size[0] * edge_len,text_img.size[1] * edge_len ) )
file_list=os.listdir(pic_dir )
img_index=0
forxinrange(0,text_img.size[0] ) :
foryinrange(0,text_img.size[1] ) :
介绍了pixel=text_img.getpixel((x,y ) ) #Part2
file _ name=file _ list [ img _ index % len (file _ list ) ]
try:
img=image.open (OS.path.join (pic _ dir,file_name ) ).convert ) ' rgba ' ) #第2部分提供了介绍
img=img.resize((edge_len,edge_Len ) )
img=trans_alpha(img,pixel ) ) ) ) ) ) ) )。
new_img.paste(img,) x * edge_len,y * edge_len ) )指定区域的替换,介绍第2部分
img_index =1
except Exception as e:
print (f ' openfile { file _ name } failed! {e} ' )
return new_i
mg(6)生成照片墙
def main(text='', font_size = 20, edge_len = 60,pic_dir = "./user", out_dir = "./out/", font_path = './demo.ttf'):
'''
生成照片墙
:param text: Text of picture wall, if not defined this will generage a rectangle picture wall
:param font_size: font size of a clear value
:param edge_len: sub picture's egde length
'''
if len(text) >= 1:
text_ = ' '.join(text)#将字符串用空格分隔开,提高展示效果
#text_ = text
print(f"generate text wall for '{text_}' with picture path:{pic_dir}")
text_img = gen_text_img(text_, font_size, font_path)
# text_img.show()
img_ascii = picture_wall_mask(text_img, edge_len, pic_dir)
# img_ascii.show()
img_ascii.save(out_dir + os.path.sep + '_'.join(text) + '.jpg')
(7)函数执行与传参
if __name__ == '__main__':
main(text='python')
文件目录结构如下,以供参考:out存放生成的照片墙,user存放贴上去的图片。
完整代码参考:git链接
(8)样图
Part 2:图像处理过程中中学习到的几个知识点:
(1)python PNG图片显示导入库文件
仅适用于显示png格式的图片
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
显示图片
lena = mpimg.imread('temp_pic.png') # 读取和代码处于同一目录下的 lena.png
# 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理
lena.shape #(512, 512, 3)
plt.imshow(lena) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
(2)PIL中图像格式转换img.convert()函数
在数字图像处理中,针对不同的图像格式有其特定的处理算法。所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现。本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。
对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”。对于PNG、BMP和JPG彩色图像格式之间的互相转换都可以通过Image模块的open()和save()函数来完成。具体说就是,在打开这些图像时,PIL会将它们解码为三通道的“RGB”图像。用户可以基于这个“RGB”图像,对其进行处理。处理完毕,使用函数save(),可以将处理结果保存成PNG、BMP和JPG中任何格式。这样也就完成了几种格式之间的转换。同理,其他格式的彩色图像也可以通过这种方式完成转换。当然,对于不同格式的灰度图像,也可通过类似途径完成,只是PIL解码后是模式为“L”的图像。
而对于Part 1中convert()函数的使用,推荐一篇博文Python图像处理库PIL中图像格式转换以供参考学习。
(3)img.paste()函数
第一个参数是用来覆盖的图片,第二个参数是覆盖的位置,参考博文。
(4)img.getpixel()函数
查看图像存储值,参考博文。
(5)python图像处理:给图像添加透明度(alpha通道)
主要介绍img.putalpha()函数的用法,参考博文
到此这篇关于利用python生成照片墙的示例代码的文章就介绍到这了,更多相关python生成照片墙内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
本文标题: 利用python生成照片墙的示例代码
本文地址: http://www.cppcns.com/jiaoben/python/306608.html