1.python PIL简介:

参考维基百科:

Python Imaging Library(缩写为PIL),是一个用于Python编程语言的免费库,它增加了对打开,操作和保存许多不同图像文件格式的支持。适用于Windows,Mac OS X和Linux。

项目地址:

  • https://github.com/python-pillow/Pillow

指导书Handbook:

  • https://pillow.readthedocs.io/en/5.3.x/

应用能力:

处理方法:

  • 像素操作;
  • 掩蔽和透明处理;
  • 图像过滤,例如模糊,轮廓,平滑或边缘查找
  • 图像增强,如锐化,调整亮度,对比度或颜色
  • 添加文本到图像等等。

支持格式:

目前,支持PPM,PNG,JPEG,GIF,TIFF和BMP。还可以创建新的文件解码器以扩展可访问的文件格式库。


2.项目中遇到的应用场景

python PIL改变图像的分辨率dpi

在项目中,遇到需要更改图像dpi的情况,比如常见dpi为72,想将其修改为96,可以使用以下代码:

from PIL import Image, ImageDraw, ImageFontdef change_pixel(inp_fn, out_fn=None, pixel=None):if out_fn is None:  # 设置输出的图像名称fn_flds = inp_fn.split('.')fn_flds[-2] += '_cp'out_fn = '.'.join(fn_flds)if pixel is None:  # 默认为72pixel = 72im = Image.open(inp_fn)  # 读取输入图像quality_score = 95im.save(out_fn, dpi=(pixel, pixel), quality=quality_socre)  # 保存图像,其输出图像out_fn的dpi会变成指定的像素。# 其中quality是保存的质量分数,取值范围为0~100,其值越大,质量越好,建议不超过95.return out_fn

修改完后: 从图中可以看到,其分辨率dpi已经从72修改为96。


python PIL resize修改图像的长宽

在项目中,遇到长宽比例不变,按照长度,或者宽度重新修改图像的尺寸,这种情况可以通过resize函数很好的解决,但是需要计算好相关但比例及真值。
以宽度为例子,比如一张图像的大小为300x375,想按照宽度重置为600,则可以用以下代码实现:

from PIL import Image, ImageDraw, ImageFont
import mathdef resize_width(inp_fn, basewidth, out_fn=None):'''resize the image accodring to width|basewidth'''# 设置输出名称if out_fn is None:fn_flds = inp_fn.split('.')fn_flds[-2] += '_rsw'out_fn = '.'.join(fn_flds)# 读入图像im = Image.open(inp_fn)w, h = im.size  # 获得图像的尺寸# basewidth 是想要获得的宽度,计算缩放比例wpercent = (basewidth/float(w))# 计算缩放的长度,向上取整hsize = math.ceil((float(h)*float(wpercent)))# resize操作,设定为Image.ANTIALIAS:高质量下采样滤波器,抗锯齿形img = im.resize((basewidth, hsize), Image.ANTIALIAS)# 保存图像img.save(out_fn, quality=95)return out_fn

修改后: 可以看到,其宽度变为了600, 高度变为750。同理也可以以长度为基底,按照长度的缩放比例改变宽度的尺寸。


python PIL生成相应的背景颜色图

生成指定颜色,大小的背景图。指定颜色是通过一组三色值组合来实现,比如白色为(255,255,255),三个值分别表示红色,绿色和蓝色
代码如下:

from PIL import Image, ImageDraw, ImageFontdef gen_img(siez=None)if size is None:size = 400# 生成大小为400x400RGBA是四通道图像,RGB表示R,G,B三通道,A表示Alpha的色彩空間image = Image.new(mode='RGBA', size=(400, 400), color=(255, 55, 55))# ImageDraw.Draw 简单平面绘图draw_table = ImageDraw.Draw(im=image)# 直接显示图片image.show()

输出结果如下:

代码不是很长,下面简单解释代码中用到的几个方法:

  • PIL.Image.new(mode, size, color=0):

    • 功能:通过给定的mode创建指定大小的image对象;
    • mode参数:定义了图像中关于像素的一些属性。比较常见的有:黑白图像L,真彩色RGB,带透明度的真彩色RGBA等;
    • size参数:以像素为单位指定图片的长与宽,tuple形式;
    • color参数:指定图片的背景色。当图像模式为RGBA时,若不指定该参数,默认便是透明背景;
  • PIL.ImageDraw.Draw(im, mode=None):

    • 功能:创建一个对象用于在image对象上进行作画;
    • im参数:已创建的image对象;
    • mode参数:定义了图像中关于像素的一些属性。若未给定,将与传入的image对象的mode参数保持一致;
  • PIL.ImageDraw.ImageDraw.text(xy, text, fill=None, font=None, direction=None)

    • 功能:在图片指定位置写一行文本,多行文本需要使用multiline_text方法;
    • xy参数:指定文本距左上角的位置,tuple形式;
    • text参数:文本内容;
    • fill参数:文本颜色,支持英文单词与十六进制表示法;
    • font参数:字体对象,一般通过ImageFont模块构建,用于指定字体文件位置与字体大小;
    • direction参数:文本内容方向,需要libraqm支持;

python PIL 图像合成

在项目中,遇到将两张图像进行叠加,分别给定叠加的具体位置,比如:
图像1:logo背景图和图像2:模特图

现在,将其叠加到一起,代码如下:

from PIL import Image, ImageDraw, ImageFontdef img_over(inp_fn, logo, x, y, out_fn=None):'''insert the img into logo background'''# 设置输出图像名称if out_fn is None:fn_flds = inp_fn.split('.')fn_flds[-2] += '_ov'out_fn = '.'.join(fn_flds)# 读入两张图像img = Image.open(inp_fn)img_logo = Image.open(logo)# 设置背景大小background = Image.new("RGB", img_logo.size, (255, 255, 255))      # convert RGBA into RGBbackground.paste(img_logo, mask=img_logo.split()[3])img_logo = background# 将输入图粘贴到背景图上,x,y指定粘贴起始位置img_logo.paste(img, (x, y))  # over# 保存img_logo.save(out_fn, quality=95)return out_fn

结果如下:

python PIL 使用遇到的问题

在项目中,常见的一个问题是:

OSError: cannot write mode RGBA as JPEG

无法将RGBA格式的图像保存为JPEG格式的图像,因此,在进行保存之前,要进行转换之后再进行保存。
常用的修改方法:
1.将四通道转换为三通道

from PIL import Image
file_in = "test.png"
img = Image.open(file_in)
file_out = "test2.bmp"
print len(img.split())  # test
if len(img.split()) == 4:#prevent IOError: cannot write mode RGBA as BMPr, g, b, a = img.split()img = Image.merge("RGB", (r, g, b))img.save(file_out)
else:img.save(file_out)
  1. 借用背景图将其转换为三通道图
img = Image.open(inp_fn)
# 设置背景大小
background = Image.new("RGB", img.size, (255, 255, 255))
# convert RGBA into RGB
background.paste(img, mask=img.split()[3])
img = background
img.save("new_jpg", quality=95)

此时的img即为三通道图,这样就可以正常保存。

python PIL使用记录相关推荐

  1. 一、python+PIL给图片添加文字水印

    python+PIL给图片添加文字水印 最近需要给同一张图片添加不同的水印保存,在网上搜了很多,也不是很有效,在这儿记录一下我运行正确无误的代码,方便自己以后查看: #读取文件每一行,写到图片中间位置 ...

  2. Python 装饰器记录总结 (终极版)

    Python 装饰器记录总结 (终极版) 原文链接:http://magicroc.com/2017/04/10/Python装饰器记录总结/ 装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申 ...

  3. python对图片颜色校正_使用Python PIL更改图像色调

    Using Python PIL, I'm trying to adjust the hue of a given image. I'm not very comfortable with the j ...

  4. python 程序耗时记录_Python学校的学生身高记录程序

    python 程序耗时记录 A team of 5 people is assigned with a task to record the heights of students in a scho ...

  5. Python常见问题解决记录1-Non-ASCII character ‘\xe7‘错误

    Python常见问题解决记录1-Non-ASCII character '\xe7'错误 参考文章: (1)Python常见问题解决记录1-Non-ASCII character '\xe7'错误 ( ...

  6. python123九宫格输入_使用python PIL库实现简单验证码的去噪方法步骤

    字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的. 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括: ...

  7. Python: PIL基本代码

    Python: PIL基本代码 # 声明使用字符库 # -*- coding: utf-8 -*- # 导入系统库 import os # 导入文件读写库 import io # 导入数学库 impo ...

  8. Python PIL支持的图像文件格式

    Python PIL 支持的图像文件格式: BMP BUFR (identify only) CUR (read only) DCX (read only) EPS (write-only) FITS ...

  9. python实现键盘记录木马_Python告诉你木马程序的键盘记录原理

    前言 Python keylogger键盘记录的功能的实现主要利用了pythoncom及pythonhook,然后就是对windows API的各种调用.Python之所以用起来方便快捷,主要归功于这 ...

  10. python对图片颜色校正,使用Python PIL更改图像色调

    Using Python PIL, I'm trying to adjust the hue of a given image. I'm not very comfortable with the j ...

最新文章

  1. 图片转字符 android,转字符图app下载-转字符图 安卓版v2.4-PC6安卓网
  2. anaconda配置环境变量
  3. 人生致命的8个经典问题[转]
  4. sysctl mysql_服务器优化——Sysctl、Apache、MySQL
  5. Ethernet/IP 学习笔记二
  6. k8s组件说明:ETCD存储组件
  7. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图
  9. 文字加减前后缀lisp_LISP 图层前后缀_显示图层的Lisp程式
  10. iOS-深拷贝和浅拷贝
  11. HoloWAN网络仿真损伤仪的基本功能及图解
  12. Java零基础学习-每日单词(日更)
  13. [安卓手机安装Apk ] 安卓手机通过数据线在电脑下载本地的Apk应用
  14. 七夕界的浪漫之光,向你安利程序员的表白方式
  15. hashCode()和哈希值
  16. 简单内存泄漏检测方法,解决Detected memory leaks!问题 .
  17. 联想笔记本突然没声音了,但是音量却是打开得,F1亮着
  18. vivado 2019.2下载地址分享,网盘分享
  19. matlab中使用simulink标准化输出图片
  20. LibGDX_2.1: LibGDX 应用框架(6 大系统交互接口)

热门文章

  1. Allegro删除Out of data shape铜皮框
  2. office精英俱乐部_开放组织读书俱乐部:收回精英制
  3. 博士阶段能学到什么硕士学不到的东西?
  4. 前端基础知识--Document的常用属性和常用函数
  5. 关于Document类型的总结
  6. Java 操作 Office:POI之word图片处理
  7. 论坛.newreply.php,discuz!论坛帖、删帖加减金钱值后台设定For D25sp1 4.3日整理版
  8. commit 和 push 的临界点
  9. 游戏功能模块——新手引导
  10. 搭建一个独立英文网站费用多少?