python PIL使用记录
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)
- 借用背景图将其转换为三通道图
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使用记录相关推荐
- 一、python+PIL给图片添加文字水印
python+PIL给图片添加文字水印 最近需要给同一张图片添加不同的水印保存,在网上搜了很多,也不是很有效,在这儿记录一下我运行正确无误的代码,方便自己以后查看: #读取文件每一行,写到图片中间位置 ...
- Python 装饰器记录总结 (终极版)
Python 装饰器记录总结 (终极版) 原文链接:http://magicroc.com/2017/04/10/Python装饰器记录总结/ 装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申 ...
- 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 ...
- python 程序耗时记录_Python学校的学生身高记录程序
python 程序耗时记录 A team of 5 people is assigned with a task to record the heights of students in a scho ...
- Python常见问题解决记录1-Non-ASCII character ‘\xe7‘错误
Python常见问题解决记录1-Non-ASCII character '\xe7'错误 参考文章: (1)Python常见问题解决记录1-Non-ASCII character '\xe7'错误 ( ...
- python123九宫格输入_使用python PIL库实现简单验证码的去噪方法步骤
字符型图片验证码识别完整过程及Python实现的博主,我的大部分知识点都是从他那里学来的. 想要识别验证码,收集足够多的样本后,首先要做的就是对验证码原始图片进行处理,对验证码识别分类之前,一般包括: ...
- Python: PIL基本代码
Python: PIL基本代码 # 声明使用字符库 # -*- coding: utf-8 -*- # 导入系统库 import os # 导入文件读写库 import io # 导入数学库 impo ...
- Python PIL支持的图像文件格式
Python PIL 支持的图像文件格式: BMP BUFR (identify only) CUR (read only) DCX (read only) EPS (write-only) FITS ...
- python实现键盘记录木马_Python告诉你木马程序的键盘记录原理
前言 Python keylogger键盘记录的功能的实现主要利用了pythoncom及pythonhook,然后就是对windows API的各种调用.Python之所以用起来方便快捷,主要归功于这 ...
- 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 ...
最新文章
- 图片转字符 android,转字符图app下载-转字符图 安卓版v2.4-PC6安卓网
- anaconda配置环境变量
- 人生致命的8个经典问题[转]
- sysctl mysql_服务器优化——Sysctl、Apache、MySQL
- Ethernet/IP 学习笔记二
- k8s组件说明:ETCD存储组件
- java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
- Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图
- 文字加减前后缀lisp_LISP 图层前后缀_显示图层的Lisp程式
- iOS-深拷贝和浅拷贝
- HoloWAN网络仿真损伤仪的基本功能及图解
- Java零基础学习-每日单词(日更)
- [安卓手机安装Apk ] 安卓手机通过数据线在电脑下载本地的Apk应用
- 七夕界的浪漫之光,向你安利程序员的表白方式
- hashCode()和哈希值
- 简单内存泄漏检测方法,解决Detected memory leaks!问题 .
- 联想笔记本突然没声音了,但是音量却是打开得,F1亮着
- vivado 2019.2下载地址分享,网盘分享
- matlab中使用simulink标准化输出图片
- LibGDX_2.1: LibGDX 应用框架(6 大系统交互接口)