用Python图像处理
前几天弄了下django的图片上传,上传之后还需要做些简单的处理,python中PIL模块就是专门用来做这个事情的。
于是照葫芦画瓢做了几个常用图片操作,在这里记录下,以便备用。
这里有个字体文件,大家可以在自己的系统中选取一个,我这打包放在网盘中 下载
一 图样
原始图片
操作一: 缩略图(通常不用这个方式,因为图片质量损坏太大)
操作二 : 旋转图片中的某一部分
操作三: 给图片添加一个图片水印, 2张图层合并
操作四: 给图片添加文字水印,这个用的比较多, 我这里弄了个白色通明低,可以弄成完全透明的
操作 五 等比压缩(比较适合做缩略图)
操作六 按照比例剪裁之后,等比压缩,有时候需要定比例的图片可以这么做
二 代码
- # -*- encoding=utf-8 -*-
- '''''
- author: orangleliu
- pil处理图片,验证,处理
- 大小,格式 过滤
- 压缩,截图,转换
- 图片库最好用Pillow
- 还有一个测试图片test.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))
- im.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 = "msyh.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('test.jpg') #image 对象
- compress_image(im)
- im = Image.open('test.jpg') #image 对象
- cut_image(im)
- im = Image.open('test.jpg') #image 对象
- logo_watermark(im, 'logo.png')
- im = Image.open('test.jpg') #image 对象
- text_watermark(im, 'Orangleliu')
- im = Image.open('test.jpg') #image 对象
- resizeImg(im, dst_w=100, qua=85)
- im = Image.open('test.jpg') #image 对象
- clipResizeImg(im, 100, 200)
三 参考
用Python图像处理的更多相关文章
- Python图像处理库:Pillow 初级教程
Python图像处理库:Pillow 初级教程 2014-09-14 翻译 http://pillow.readthedocs.org/en/latest/handbook/tutorial.html ...
- Python图像处理之验证码识别
在上一篇博客Python图像处理之图片文字识别(OCR)中我们介绍了在Python中如何利用Tesseract软件来识别图片中的英文与中文,本文将具体介绍如何在Python中利用Tesseract ...
- 【python图像处理】图像的缩放、旋转与翻转
[python图像处理]图像的缩放.旋转与翻转 图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图 ...
- Python图像处理库(1)
转自:http://www.ituring.com.cn/tupubarticle/2024 第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Py ...
- Python图像处理库:PIL中Image,ImageDraw等基本模块介绍
Python图像处理库:PIL中Image,ImageDraw等基本模块介绍 标签: 图像处理PILPYTHON 2016-08-19 10:58 461人阅读 评论(0) 收藏 举报 分类: 其他 ...
- Python图像处理库PIL中图像格式转换(一)
在数字图像处理中,针对不同的图像格式有其特定的处理算法. 所以,在做图像处理之前,我们须要考虑清楚自己要基于哪种格式的图像进行算法设计及事实上现.本文基于这个需求.使用python中的图像处理库PIL ...
- python 图像处理中二值化方法归纳总结
python图像处理二值化方法 1. opencv 简单阈值 cv2.threshold 2. opencv 自适应阈值 cv2.adaptiveThreshold 3. Otsu's 二值化 例子: ...
- python图像处理:一福变五福
快过年了,各种互联网产品都出来撒红包.某宝一年一度的“集五福活动”更是成为每年的必备活动之一. 虽然到最后每人大概也就分个两块钱,但作为一个全民话题,大多数人还是愿意凑凑热闹. 毕竟对于如今生活在大城 ...
- Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像
前文传送门: 「Python 图像处理 OpenCV (1):入门」 普通操作 1. 读取像素 读取像素可以通过行坐标和列坐标来进行访问,灰度图像直接返回灰度值,彩色图像则返回B.G.R三个分量. 需 ...
- Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 图像属性 图像 ...
随机推荐
- Android传统HTTP请求get----post方式提交数据(包括乱码问题)
1.模仿登入页面显示(使用传统方式是面向过程的) 使用Apache公司提供的HttpClient API是面向对象的 (文章底部含有源码的连接,包括了使用async框架) (解决中文乱码的问题.主要 ...
- JS禁用右键+禁用Ctrl+u+禁用F12
第一种方法: , , ]; document.oncontextmenu = new Function("event.returnValue=false;"),//禁用右键 doc ...
- Java系列之JDBC和ODBC之间的差别与联系
JDBC简单介绍 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于运行SQL语句的Java API,它是Java十三个规范之中的一个.能够为多种关系数据 ...
- LNMP 架构 上传文件
修改PHP上传文件大小限制的方法 修改PHP上传文件大小限制的方法1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页最久执行时间为 30 ...
- js实现原生Ajax的封装及ajax原理详解
原理及概念 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指可以通过服务器语言结合数 ...
- Spring整合JUnit4测试使用注解引入多个配置文件
转自:https://kanpiaoxue.iteye.com/blog/2151903 我们使用spring写junit单测的时候,有的时候我们的spring配置文件只有一个.我们在类的注释上面会这 ...
- systemd实践: 依据情况自动重启服务
systemd服务异常自动重启很好用,但有的时候希望某些服务只在特定情况下进行重启,其他时候不要自动重启(比如OOM,需要人工介入). 本文抛砖引玉,旨在能够让读者对systemd的重启机制有一定了解 ...
- ettercap + driftnet 实现同网段下流量欺骗
前言: 由于在局域网中,网关会不断地发送 ARP 数据包询问当前是否有新的客户端上线,如果我们可以欺骗当前局域网网段下的主机, 把我们当成网关地址,并且我们把欺骗的流量转发到真正的网关地址,这样我们就 ...
- Elasticsearch日志收集
Install pip if necessary curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py&q ...
- linq的教程
http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html