1. 前言

不久之前写过一篇文章,详细介绍了 PIL 库中的 Image 模块的使用。曾经学习过、使用过一段时间的 PS,认识 PIL 后,觉得这这玩意太好玩了,有了想使用 PIL 库实现 PS 中的图片特效的想法。

好,现在直接上案例,不另废其它话。

2. 遮罩图片

本文案例中所用的图片素材,取自于我舅舅的书法作品(有点小名气的书法家)。

第一张书法作品:心佛。

这张心中有佛的作品,我只需要上面的佛字,进行后续操作之前,首要任务是截取佛字,也就整张图片的上面一部分。

这里使用两种方案实现。

2.1 使用 Image 模块的裁剪方法

此方法简单直接,裁剪时需要指定裁剪的矩形区域,左上角坐标容易确定(0,0),右下角的坐标这里就大概判断,眼观一下,佛字大概是整幅作品的 四 分之一。

也可以稍精准的计算机出右下角的位置。

佛字和下面的内容之间有一条较完整的白色分割区域。可以从上向下以行为单位扫描整幅图片,如果发现那一行像素点的 R,G,B 的值近似相等且值都大于 200 以上,则可判断出位置。有兴趣者可以试试。

from PIL import Image
# 打开原图片
fo_img = Image.open("fo.jpg")
# 因后续要使用此图片做遮罩,需要透明通道,所以要转换成 RGBA 模式
fo_img = fo_img.convert("RGBA")
# 获取图片本身大小
w, h = fo_img.size
# h/4-55 完全是试出来的偏差值
fo_img = fo_img.crop((0, 0, w, h / 4 - 55))
fo_img.show()

如下是裁剪出来的图片效果。

2.2 一个像素点一个像素点的裁剪

当把 RGB 模式转换成 RGBA 模式后,Python 解释器会给多出来的 a 通道赋值 255 。

因后面要使用这个佛字做遮罩。这里需要把佛字图片中的白色区域的 a 通道值修正为 0(白色区域全部变成透明区域)。

因是书法图片,整张图片整体上呈现明显的黑白两极分布,白色区域的 R、G、B 分量值大概是在 200 左右,黑色文字的 R,G,B 颜色分量值大概在 100 以下。

Tip: 当使用一张图片做遮罩时,图片的 a 通道值为 0 的地方,被遮罩图片所遮住的图片会变成透明。a 通道为 255 的地方,表示完全不透明,从 0 到 255 之间由透明逐渐梯度变成不透明。

from PIL import Image
fo_img = Image.open("fo.jpg")
# 先转换成 RGBA 模式
fo_img = fo_img.convert("RGBA")
# 获取图片本身大小
w, h = fo_img.size
# 创建一张空白的新图片,大小和要裁剪的佛字图片一样大小
fo_only_img = Image.new(fo_img.mode, (w, int(h / 4) - 55))
w, h = fo_only_img.size
for i in range(w):for j in range(h):# 获取每一像素点的颜色分量r, g, b, a = fo_img.getpixel((i, j))# 把白色区域的 a 值修改为 0 ,白色区域的R,G,B值相近if r > 180 or g>180 or b>180:a = 0# 为新图片指定新的颜色模式fo_only_img.putpixel((i, j), (r, g, b, a))
fo_only_img.show()

以上代码需注意,截取出来的图片数据被写入一张新图片中。

两种方案比较:

  • 第一种方案提取后,还是需要再修改每一个像素点的透明信息。

  • 第 2 种方案一步到位。

处理完佛字图片后,再准备一张春归的书法作品做被遮罩图片。

为了让便于理解遮罩图片与被遮罩图片的关系,这里画一个示意图。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kq7kf3qB-1647356801266)(D:\红泥巴\我的文章\piltx\zz.png)]
在如下的代码还会创建一张做背景的白色图片。

from PIL import Image
fo_img = Image.open("fo.jpg")
# 先转换成 RGBA 模式
fo_img = fo_img.convert("RGBA")
# 获取图片本身大小
w, h = fo_img.size
# 创建一张空白的新图片,大小和要裁剪的佛字图片一样大小
fo_only_img = Image.new(fo_img.mode, (w, int(h / 4) - 55))
w, h = fo_only_img.size
for i in range(w):for j in range(h):# 获取每一像素点的颜色分量r, g, b, a = fo_img.getpixel((i, j))# 把白色区域的 a 值修改为 0if r > 180:a = 0# 为新图片指定新的颜色模式fo_only_img.putpixel((i, j), (r, g, b, a))
# 开始准备做遮罩效果之前,打开被遮罩图
chun_gui_img = Image.open("chungui.jpg")
# 修改 chun_gui_img 图片和遮罩图片一样大小
chun_gui_img = chun_gui_img.resize(fo_only_img.size)
# 创建一张新的、空白的、纯白色的背景图片
new_img = Image.new("RGBA", chun_gui_img.size)
# 开始粘贴
new_img.paste(chun_gui_img, mask=fo_only_img)
new_img.show()

执行代码后,可看到如下的图片效果。这个效果在 PS 中更容易实现(毕竟人家是专业的图片处理软件)。

几个变化:

  1. 反转效果

    前面是把佛字图片的白色区域的 a 值设定为 0,则白色区域所对应的春归图片会变成透明。现在反过来,把文字区域的 a 值设为 0。就可以看到和上图相反的一个效果。

from PIL import Image
import randomfo_img = Image.open("fo.jpg")
# 先转换成 RGBA 模式
fo_img = fo_img.convert("RGBA")
# 获取图片本身大小
w, h = fo_img.size
# 创建一张空白的新图片,大小和要裁剪的佛字图片一样大小
fo_only_img = Image.new(fo_img.mode, (w, int(h / 4) - 55))
w, h = fo_only_img.size
# 步长值
step = 1
step1 = 1
for i in range(0, w, 1):for j in range(h):# 获取每一像素点的颜色分量r, g, b, a = fo_img.getpixel((i, j))# 文字区域的 a 值设置为 0if r < 80:a = 0# 为新图片指定新的颜色模式fo_only_img.putpixel((i, j), (r, g, b, a))
# 开始准备做遮罩效果之前,先打开底图
chun_gui_img = Image.open("chungui.jpg")
# 修改 chun_gui_img 图片和遮罩图片一样大小
chun_gui_img = chun_gui_img.resize(fo_only_img.size)
# 创建一张新的图片
new_img = Image.new("RGBA", chun_gui_img.size,(100,200,80))
# 开始粘贴
new_img.paste(chun_gui_img, mask=fo_only_img)
new_img.show()

如果把背景颜色设置为金色,佛字就会变成金色。同理,可以选择任一喜欢的颜色。

new_img = Image.new("RGBA", chun_gui_img.size,ImageColor.getrgb("gold"))

  1. 颗粒效果

颗粒效果实现的思路和前面差不多,使用随机模块让文字区域的透明值随机变化,让文字区域有的地方透明,有的地方不透明,有的地方半透明。

from PIL import Image
import random
fo_img = Image.open("fo.jpg")
# 先转换成 RGBA 模式
fo_img = fo_img.convert("RGBA")
# 获取图片本身大小
w, h = fo_img.size
# 创建一张空白的新图片,大小和要裁剪的佛字图片一样大小
fo_only_img = Image.new(fo_img.mode, (w, int(h / 4) - 55))
w, h = fo_only_img.size
print(w)
# 步长值
step = 1
for i in range(0, w, 1):for j in range(h):# 获取每一像素点的颜色分量r, g, b, a = fo_img.getpixel((i, j))if r > 180:a = 0elif r < 100:# 随机a -= random.randint(0, 255)# 为新图片指定新的颜色模式fo_only_img.putpixel((i, j), (r, g, b, a))
# 开始准备做遮罩效果之前,先打开底图
chun_gui_img = Image.open("chungui.jpg")
# 修改 chun_gui_img 图片和遮罩图片一样大小
chun_gui_img = chun_gui_img.resize(fo_only_img.size)
# 创建一张新的图片
new_img = Image.new("RGBA", chun_gui_img.size)
# 开始粘贴
new_img.paste(chun_gui_img, mask=fo_only_img)
new_img.show()

3. 字符串图片

把图片中的每一像素点用不同的字符串替换,然后保存字符串信息。如下代码中,白色区域的像素点使用“仁”字替换。黑色文字区域的像素点使用“佛”字替换。

from PIL import Image
import random
fo_img = Image.open("fo.jpg")
# 先转换成 RGBA 模式
fo_img = fo_img.convert("RGBA")
# 获取图片本身大小
w, h = fo_img.size
# 创建一张空白的新图片,大小和要裁剪的佛字图片一样大小
fo_only_img = Image.new(fo_img.mode, (w, int(h / 4) - 55))
w, h = fo_only_img.size
# 步长值
old_rgb = None
s = ''
for i in range(w):for j in range(h):# 获取每一像素点的颜色分量r, g, b, a = fo_img.getpixel((i, j))fo_only_img.putpixel((i, j), (r, g, b, a))fo_only_img = fo_only_img.resize((300, 300))
w, h = fo_only_img.size
for i in range(h):for j in range(w):r, g, b, a = fo_only_img.getpixel((j, i))if r > 100:s += "仁"else:s += '佛's += "\n"
with open("d:/fo.txt", 'w') as f:f.write(s)

找到对应文本文件、打开、缩小,可以清晰看到一个大大的“佛”字。如果放大,则会发现,整个佛字是由很多小佛字组成。

4. 总结

编程与书法一样,都是一门艺术,艺术是为生活服务的。程序可以让人类的生活更方便,书法则可以让人类精神世界更美好。当两者碰在一起后,世界充满仁和爱。
获取更多技术文章,请关注我的公众号:

Python 让书法作品和 PIL 库来一场美丽的邂逅相关推荐

  1. python:程序猿的方式在元宵佳节之际,带你设计【东方明珠】动画浪漫烟花秀(python编程利用Tkinter+PIL库)

    python:程序猿的方式在元宵佳节之际,带你设计[东方明珠]动画浪漫烟花秀(python编程利用Tkinter+PIL库) 目录 设计动画展示 设计思路 核心代码 设计动画展示 设计思路 核心代码 ...

  2. python自带的PIL库扩展图片大小给图片加上文字描述

    利用python自带的PIL库扩展图片大小给图片加上文字描述.大多都是库函数调用,只是给定图片宽度后计算文字所需行数的代码需要写. 代码比较丑,but it works. #!/usr/bin/env ...

  3. Python 随笔:用 PIL 库读取图像文件像素长宽大小

    Python 随笔:用 PIL 库读取图像文件像素宽高大小 1.前言 安装 PIL 库(全称是pillow),所以安装命令上的名称是pillow pip install pillow 2. 使用pil ...

  4. Python笔记八:PIL库的使用

    PIL库支持图像存储.显示和处理,它能够处理几乎所有的图片格式,可以完成对图像的缩放.剪裁.叠加以及向图像添加线条.图像和文字等操作. 1.  图像归档(Image Archives).PIL非常适合 ...

  5. python add picture显示过大_利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例...

    前言 最近的一个项目中需要在图片上添加文字,使用了OpenCV,结果发现利用opencv给图像添加文字有局限.可利用的字体类型比较少,需要安装Freetype扩展,比较复杂.而且不能用putText函 ...

  6. 使用Python PIL库中的Image.thumbnail函数裁剪图片

    发现自己还没有头像,想着上传ubuntu系统中我很喜欢的一个背景图片来当头像,但是因为图片过大,上传失败了.那么,我们如何使用python中强大的PIL库来进行图片裁剪呢? from PIL impo ...

  7. pil库修改图片大小_python 利用PIL库进行更改图片大小的操作

    python 是可以利用PIL库进行更改图片大小的操作的,当然一般情况下是不需要的,但是在一些特殊的利用场合,是需要改变图片的灰度或是大小等的操作的,其实用python更改图片的大小还是蛮简单的,只需 ...

  8. 使用Python PIL库实现简单验证码的去噪处理

    想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括:将彩色图片转换成灰度图.将灰度图二值化和去除噪点三个基本过程.这里仅以比较简单的验证码为例, ...

  9. pythonpil库过滤图像contour_快乐python 零基础也能P图 —— PIL库

    python pil pil (python image library) 库是python语言的一个第三方库,pil库支持图像存储.显示和处理,能够处理几乎所有格式的图片. 一.pil库简介 1. ...

  10. db2top详细使用方法_Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略

    Py之PIL:Python的PIL库的简介.安装.使用方法详细攻略 目录 PIL库的简介 PIL库的安装 PIL库的用方法 1.几何图形的绘制与文字的绘制 2.绘制图形的各种案例 PIL库的简介 PI ...

最新文章

  1. AC日记——小书童——刷题大军 洛谷 P1926
  2. python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数默认返回浮点数
  3. 随机顺序_SSD固态硬盘的顺序读写和随机读写区别,谁更重要?
  4. 一身漏洞狂奔24年!人人都用的WiFi被曝重大漏洞,随时成为监控你的工具
  5. python九九乘法口诀表-Python 九九乘法表
  6. one or more of the ports are invalid. Open the server editor and correct the invalid ports
  7. hadoop关联文件处理
  8. python 输入正方形_Python打印正方形
  9. java HashMap实现中文分词器 应用:敏感词过滤实现
  10. java 综合练习_Java 之综合练习
  11. Python攻克之路-xml模块
  12. 各式各样的极品程序员 你属于哪一种
  13. tcpdump抓包+wireshark分析配合使用(二)
  14. pdf.js跨域加载文件
  15. tensorflow.js基本使用 图标识别(八)
  16. 阿里云对象存储上传或复制文件时报The request signature we calculated does not match the signature you provided...
  17. RoaringBitmap位图数据结构及源码分析
  18. 【FPGA】:ip核---乘法器(multiplier)
  19. 5G LAN — 技术实现原理
  20. oracle雾化试图_ORACLE物化视图具体解释

热门文章

  1. 如何选择一款合适的福禄克数字万用表?FLUKE
  2. 计算几何常用的函数/方法
  3. 提示Algorithm negotiation failed 错误该如何解决
  4. Java学习笔记6——网络编程
  5. Android 在系统启动时设置声卡权限,[RK3288][Android7.1]强制使用默认声卡播放声音...
  6. 如何看懂常用原理图符号、如何阅读原理图
  7. 蛋白质非标记定量技术lable free
  8. FW:nbsp;司马相如琴挑文君真相:劫色劫…
  9. 测试网速_使用Speedtest CLI测试你的网速
  10. 什么?TTL信号也能高速稳定传输100m+?是的,你没有听错,量产电路推荐!