利用python生成照片墙的示例代码


Posted in Python onApril 09, 2020

PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。

PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3。本文只使用了PIL那些最常用的特性与用法,主要参考自:http://www.effbot.org/imagingbook。

Part 1:利用python生成照片墙

(1)简要介绍思路:

(1)通过给定字符串生成一张图片;
(2)然后将该图片的每个像素的宽扩张edge_len倍,高也扩张edge_len倍,假设edge_len=60,那么原文字图片的每个像素就变成了60*60像素的一个图片;
(3)原文字图片的每个像素的透明度不同,显示文字的地方,透明度低(不透明),这2个字周边的地方,透明度高(透明),我们根据原文字图片每个像素的透明度,来设定放到这个像素(其实宽高已经扩大了60倍)图片的透明度(trans_alpha方法实现)。

(2)导入库文件

from PIL import Image, ImageDraw, ImageFont
import os

(3)由文字生成图像

def gen_text_img(text, font_size=20, font_path=None):
  # args:文字内容,文字字体大小,字体路径
  font = ImageFont.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),之后是文字,然后颜色,最后设置字体
  draw.text((0, 0), text, fill=(0, 0, 0), font=font)
  text_img.save('./temp_pic.jpg')
  return text_img

(4)透明度调节

def trans_alpha(img, pixel):
  '''
  根据rgba的pixel调节img的透明度
  这里传进来的pixel是一个四元组(r,g,b,alpha)
  '''
  _, _, _, alpha = img.split()
  alpha = alpha.point(lambda i: pixel[-1]*10)
  img.putalpha(alpha)  #Part2有介绍
  return img

(5)根据透明度参数对放大文字图进行像素覆盖

def picture_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
  for x in range(0, text_img.size[0]):
    for y in range(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')#Part2有介绍
        img = img.resize((edge_len, edge_len))
        img = trans_alpha(img, pixel)
        new_img.paste(img, (x * edge_len, y * edge_len)) #指定区域替换,Part2有介绍
        img_index += 1
      except Exception as e:
        print(f"open file {file_name} failed! {e}")
  return new_img

(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存放贴上去的图片。

利用python生成照片墙的示例代码

完整代码参考:git链接

(8)样图

利用python生成照片墙的示例代码
利用python生成照片墙的示例代码

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 相关文章推荐
python BeautifulSoup设置页面编码的方法
Apr 03 Python
Python多线程爬虫简单示例
Mar 04 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
python中map的基本用法示例
Sep 10 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
python实现QQ批量登录功能
Jun 19 Python
python防止随意修改类属性的实现方法
Aug 21 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
python中把元组转换为namedtuple方法
Dec 09 Python
python实现对doc、txt、xls等文档的读写操作
Apr 02 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 Python
Python 改变数组类型为uint8的实现
Apr 09 #Python
pandas 强制类型转换 df.astype实例
Apr 09 #Python
python 给图像添加透明度(alpha通道)
Apr 09 #Python
Python日志logging模块功能与用法详解
Apr 09 #Python
解决python DataFrame 打印结果不换行问题
Apr 09 #Python
Python的PIL库中getpixel方法的使用
Apr 09 #Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 #Python
You might like
虫族 ZERG 概述
2020/03/14 星际争霸
基于empty函数的输出详解
2013/06/17 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
JavaScript 调试器简介
2009/02/21 Javascript
快速排序 php与javascript的不同之处
2011/02/22 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
python中base64加密解密方法实例分析
2015/05/16 Python
Python读大数据txt
2016/03/28 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
python 默认参数相关知识详解
2019/09/18 Python
Python如何使用函数做字典的值
2019/11/30 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
工厂仓管员岗位职责
2014/01/01 职场文书
市场部经理岗位职责
2014/04/10 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
2015年药房工作总结
2015/04/25 职场文书
JavaScript中isPrototypeOf函数
2021/11/07 Javascript
Spring事务管理下synchronized锁失效问题的解决方法
2022/03/31 Java/Android
Python开发五子棋小游戏
2022/05/02 Python
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers