python3 pillow使用测试
# -*- encoding=utf-8 -*-
'''''
pil处理图片,验证,处理
大小,格式 过滤
压缩,截图,转换
图片库最好用Pillow
还有一个测试图片img.jpg, 一个log图片,一个字体文件
'''
# 图片的基本参数获取
try:
from PIL import Image, ImageDraw, ImageFont, ImageEnhance
except ImportError:
import Image, ImageDraw, ImageFont, ImageEnhance
def compress_image(img, w=128, h=128):
'''''
缩略图
'''
img.thumbnail((w, h))
img.save('test1.png', 'PNG')
print(u'成功保存为png格式, 压缩为128*128格式图片')
def cut_image(img):
'''''
截图, 旋转,再粘贴
'''
# eft, upper, right, lower
# x y z w x,y 是起点, z,w是偏移值
width, height = img.size
box = (width - 200, height - 100, width, height)
region = img.crop(box)
# 旋转角度
region = region.transpose(Image.ROTATE_180)
img.paste(region, box)
img.save('test2.jpg', 'JPEG')
print(u'重新拼图成功')
def logo_watermark(img, logo_path):
'''''
添加一个图片水印,原理就是合并图层,用png比较好
'''
baseim = img
logoim = Image.open(logo_path)
bw, bh = baseim.size
lw, lh = logoim.size
baseim.paste(logoim, (bw - lw, bh - lh))
baseim.save('test3.jpg', 'JPEG')
print(u'logo水印组合成功')
def text_watermark(img, text, out_file="test4.jpg", angle=23, opacity=0.50):
'''''
添加一个文字水印,做成透明水印的模样,应该是png图层合并
http://www.pythoncentral.io/watermark-images-python-2x/
这里会产生著名的 ImportError("The _imagingft C module is not installed") 错误
Pillow通过安装来解决 pip install Pillow
'''
watermark = Image.new('RGBA', img.size, (255, 255, 255)) # 我这里有一层白色的膜,去掉(255,255,255) 这个参数就好了
FONT = "simhei.ttf"
size = 2
n_font = ImageFont.truetype(FONT, size) # 得到字体
n_width, n_height = n_font.getsize(text)
text_box = min(watermark.size[0], watermark.size[1])
while (n_width + n_height < text_box):
size += 2
n_font = ImageFont.truetype(FONT, size=size)
n_width, n_height = n_font.getsize(text) # 文字逐渐放大,但是要小于图片的宽高最小值
text_width = (watermark.size[0] - n_width) / 2
text_height = (watermark.size[1] - n_height) / 2
# watermark = watermark.resize((text_width,text_height), Image.ANTIALIAS)
draw = ImageDraw.Draw(watermark, 'RGBA') # 在水印层加画笔
draw.text((text_width, text_height),
text, font=n_font, fill="#21ACDA")
watermark = watermark.rotate(angle, Image.BICUBIC)
alpha = watermark.split()[3]
alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
watermark.putalpha(alpha)
Image.composite(watermark, img, watermark).save(out_file, 'JPEG')
print(u"文字水印成功")
# 等比例压缩图片
def resizeImg(img, dst_w=0, dst_h=0, qua=85):
'''''
只给了宽或者高,或者两个都给了,然后取比例合适的
如果图片比给要压缩的尺寸都要小,就不压缩了
'''
ori_w, ori_h = im.size
widthRatio = heightRatio = None
ratio = 1
if (ori_w and ori_w > dst_w) or (ori_h and ori_h > dst_h):
if dst_w and ori_w > dst_w:
widthRatio = float(dst_w) / ori_w # 正确获取小数的方式
if dst_h and ori_h > dst_h:
heightRatio = float(dst_h) / ori_h
if widthRatio and heightRatio:
if widthRatio < heightRatio:
ratio = widthRatio
else:
ratio = heightRatio
if widthRatio and not heightRatio:
ratio = widthRatio
if heightRatio and not widthRatio:
ratio = heightRatio
newWidth = int(ori_w * ratio)
newHeight = int(ori_h * ratio)
else:
newWidth = ori_w
newHeight = ori_h
im.resize((newWidth, newHeight), Image.ANTIALIAS).save("test5.jpg", "JPEG", quality=qua)
print(u'等比压缩完成')
'''''
Image.ANTIALIAS还有如下值:
NEAREST: use nearest neighbour
BILINEAR: linear interpolation in a 2x2 environment
BICUBIC:cubic spline interpolation in a 4x4 environment
ANTIALIAS:best down-sizing filter
'''
# 裁剪压缩图片
def clipResizeImg(im, dst_w, dst_h, qua=95):
'''''
先按照一个比例对图片剪裁,然后在压缩到指定尺寸
一个图片 16:5 ,压缩为 2:1 并且宽为200,就要先把图片裁剪成 10:5,然后在等比压缩
'''
ori_w, ori_h = im.size
dst_scale = float(dst_w) / dst_h # 目标高宽比
ori_scale = float(ori_w) / ori_h # 原高宽比
if ori_scale <= dst_scale:
# 过高
width = ori_w
height = int(width / dst_scale)
x = 0
y = (ori_h - height) / 2
else:
# 过宽
height = ori_h
width = int(height * dst_scale)
x = (ori_w - width) / 2
y = 0
# 裁剪
box = (x, y, width + x, height + y)
# 这里的参数可以这么认为:从某图的(x,y)坐标开始截,截到(width+x,height+y)坐标
# 所包围的图像,crop方法与php中的imagecopy方法大为不一样
newIm = im.crop(box)
im = None
# 压缩
ratio = float(dst_w) / width
newWidth = int(width * ratio)
newHeight = int(height * ratio)
newIm.resize((newWidth, newHeight), Image.ANTIALIAS).save("test6.jpg", "JPEG", quality=95)
print('''
"old size %s %s" % (ori_w, ori_h)
print
"new size %s %s" % (newWidth, newHeight)
print
u"剪裁后等比压缩完成"
''')
if __name__ == "__main__":
'''''
主要是实现功能, 代码没怎么整理
'''
im = Image.open('img.jpg') # image 对象
compress_image(im)
im = Image.open('img.jpg') # image 对象
cut_image(im)
im = Image.open('img.jpg') # image 对象
logo_watermark(im, 'logo.png')
im = Image.open('img.jpg') # image 对象
text_watermark(im, 'arthas')
im = Image.open('img.jpg') # image 对象
resizeImg(im, dst_w=100, qua=85)
im = Image.open('img.jpg') # image 对象
clipResizeImg(im, 100, 200)
python3 pillow使用测试的更多相关文章
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- 基于python3在nose测试框架的基础上添加测试数据驱动工具
[本文出自天外归云的博客园] Python3下一些nose插件经过2to3的转换后失效了 Python的nose测试框架是通过python2编写的,通过pip3install的方式安装的nose和相关 ...
- Python3基础 hasattr 测试类是否有指定的类属性
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Windows下安装python2和python3双版本
现在大家常用的桌面操作系统有:Windows.Mac OS.ubuntu,其中Mac OS 和 ubuntu上都会自带python.这里我们只介绍下Windows(我用的Win10)环境下的pytho ...
- Python3学习笔记 - 准备环境
前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...
- python3中,os.path模块下常用的用法总结
abspath basename dirname exists getatime getctime getmtime getsize isabs isdir isfile islink ismount ...
- 【转】Python3—UnicodeEncodeError 'ascii' codec can't encode characters in position 0-1
转自:https://blog.csdn.net/AckClinkz/article/details/78538462 环境 >>> import sys >>> ...
- Python3学习笔记29-发送邮件
email模块用来构造邮件,smtplib模块用来发送邮件. 以QQ邮箱为例 想要在代码中使用QQ邮箱发送邮件,需要先在QQ邮箱-设置-账户中,开启SMTP服务,然后生成授权码.在进行验证账号时,用生 ...
- linux centos7安装python3
折腾 Python官网: https://www.python.org/ 查看相关评论,众人大呼python2与python3为两种语言,既然继承性不大,那我也就直接学python3了. 在系统选择, ...
随机推荐
- SQLite使用事务
关键代码 SQLiteDatabase db = myDataHelper.getWritableDatabase(); // 开启事务 db.beginTransaction(); try{ db. ...
- Fragment生命周期和Activity生命周期的关系
Fragment生命周期: 重点回调函数: 1. onAttach()当碎片和活动建立关联的时候调用.2. onCreateView()为碎片创建视图(加载布局)时调用.3. onActivityCr ...
- OpenStack二三事(1)
更新系列不是教材,不说教,不讲道理,仅仅记录. OpenStack在云计算领域大热,没有理由不去了解它. 先说说我对OpenStack的感觉,开源.廉价.麻烦.大家都在用,在了解开发流程后.OpenS ...
- java Map根据value排序
通用方法 public class MapUtil { public static <K, V extends Comparable<? super V>> Map<K, ...
- 修改EXCEL
import xlrdfrom xlutils import copy # 先用xlrd模块,打开一个excelbook=xlrd.open_workbook('app_student.xls') # ...
- Tomcat + Spring MVC + HttpClient:怎样使用PUT和PATCH方法传递数据
在RESTful风格的API中.PUT/PATCH方法一般用于更新数据.在项目的代码中,使用的是HttpClient 4.5,是这样写的: protected JSONObject doHttpUri ...
- 多数据源动态关联报表的制作(birt为例)
使用Jasper或BIRT等报表工具时,常会碰到一些很规的统计,用报表工具本身或SQL都难以处理,比方与主表相关的子表分布在多个数据库中,报表要展现这些数据源动态关联的结果.集算器具有结构化强计算引擎 ...
- svn解决冲突和commit
当使用svn出现 svn: E155015: 提交失败(细节如下):svn: E155015: 提交终止: “/home/test.file” 处于冲突状态 解决办法: svn resolved /h ...
- POJ 3126 Prime Path (BFS+剪枝)
题目链接:传送门 题意: 给定两个四位数a.b,每次能够改变a的随意一位.而且确保改变后的a是一个素数. 问最少经过多少次改变a能够变成b. 分析: BFS,每次枚举改变的数,有一个剪枝,就是假设这个 ...
- smarty模版使用php标签,如何获取模版变量
smarty模版使用php标签,如何获取模版变量 in: 后端程序 已经assign一个模版变量$assign,由于要做特殊的循环输出,使用for循环,因此使用到了php标签,但是php语句和模版语句 ...