python使用pil进行图像处理(等比例压缩、裁剪)实例代码


Posted in Python onDecember 11, 2017

PIL中设计的几个基本概念

1.通道(bands):即使图像的波段数,RGB图像,灰度图像

以RGB图像为例:

>>>from PIL import Image
>>>im = Image.open('*.jpg')   # 打开一张RGB图像
>>>im_bands = im.g
etbands() # 获取RGB三个波段
>>>len(im_bands)
>>>print im_bands[0,1,2]     # 输出RGB三个值

2.模式(mode):定义了图像的类型和像素的位宽。共计9种模式:

>>> im.mode
① 1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。
② L:8位像素,表示黑和白。
③ P:8位像素,使用调色板映射到其他模式。
④ RGB:3x8位像素,为真彩色。
⑤ RGBA:4x8位像素,有透明通道的真彩色。
⑥ CMYK:4x8位像素,颜色分离。
⑦ YCbCr:3x8位像素,彩色视频格式。
⑧ I:32位整型像素。
⑨ F:32位浮点型像素。

3.尺寸(size):获取图像水平和垂直方向上的像素数

>>> im.size()

4.坐标系统(coordinate system):

PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。

注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。

5.调色板(palette):

调色板模式("P")适用一个颜色调色板为每一个像素定义具体的颜色值。

6.信息(info)

>>> im.info() # 返回值为字典对象

7.滤波器(filters):将多个输入像素映射为一个输出像素的几何操作

PIL提供了4种不同的采样滤波器:

① NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。

② BILINEAR:双线性内插滤波。在输入图像的2*2矩阵上进行线性插值。

③ BICUBIC:双立方滤波。在输入图像的4*4矩阵上进行立方插值。

④ ANTIALIAS:平滑滤波。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。

im.resize()和im.thumbnail()用到了滤波器

方法一:resize(size,filter = None)

>>> from PIL import Image 
>>> im = Image.open('*.jpg')
>>> im.size
>>> im_resize = im.resize((256,256)) #default 情况下是NEAREST插值方法
>>> im_resize0 = im.resize((256,256), Image.BILINEAR)
>>> im_resize0.size
>>> im_resize1 = im.resize((256,256), Image.BICUBIC)
>>> im_resize2 = im.resize((256,256), Image.ANTIALIAS)

方法二:im.thumbnail(size,filter = None)

对于pil的相关介绍就到这里了,下面分享一个使用pil进行图像处理(等比例压缩、裁剪)实例代码,如下:

#coding:utf-8
'''
  python图片处理
  @author:fc_lamp
  @blog:http://fc-lamp.blog.163.com/
'''
import Image as image
#等比例压缩图片
def resizeImg(**args):
  args_key = {'ori_img':'','dst_img':'','dst_w':'','dst_h':'','save_q':75}
  arg = {}
  for key in args_key:
    if key in args:
      arg[key] = args[key]
  im = image.open(arg['ori_img'])
  ori_w,ori_h = im.size
  widthRatio = heightRatio = None
  ratio = 1
  if (ori_w and ori_w > arg['dst_w']) or (ori_h and ori_h > arg['dst_h']):
    if arg['dst_w'] and ori_w > arg['dst_w']:
      widthRatio = float(arg['dst_w']) / ori_w #正确获取小数的方式
    if arg['dst_h'] and ori_h > arg['dst_h']:
      heightRatio = float(arg['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(arg['dst_img'],quality=arg['save_q'])
  '''
  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(**args):
  args_key = {'ori_img':'','dst_img':'','dst_w':'','dst_h':'','save_q':75}
  arg = {}
  for key in args_key:
    if key in args:
      arg[key] = args[key]
  im = image.open(arg['ori_img'])
  ori_w,ori_h = im.size
  dst_scale = float(arg['dst_h']) / arg['dst_w'] #目标高宽比
  ori_scale = float(ori_h) / ori_w #原高宽比
  if ori_scale >= dst_scale:
    #过高
    width = ori_w
    height = int(width*dst_scale)
    x = 0
    y = (ori_h - height) / 3
  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(arg['dst_w']) / width
  newWidth = int(width * ratio)
  newHeight = int(height * ratio)
  newIm.resize((newWidth,newHeight),image.ANTIALIAS).save(arg['dst_img'],quality=arg['save_q'])
#水印(这里仅为图片水印)
def waterMark(**args):
  args_key = {'ori_img':'','dst_img':'','mark_img':'','water_opt':''}
  arg = {}
  for key in args_key:
    if key in args:
      arg[key] = args[key]
  im = image.open(arg['ori_img'])
  ori_w,ori_h = im.size
  mark_im = image.open(arg['mark_img'])
  mark_w,mark_h = mark_im.size
  option ={'leftup':(0,0),'rightup':(ori_w-mark_w,0),'leftlow':(0,ori_h-mark_h),
       'rightlow':(ori_w-mark_w,ori_h-mark_h)
       }
  im.paste(mark_im,option[arg['water_opt']],mark_im.convert('RGBA'))
  im.save(arg['dst_img'])
#Demon
#源图片
ori_img = 'D:/tt.jpg'
#水印标
mark_img = 'D:/mark.png'
#水印位置(右下)
water_opt = 'rightlow'
#目标图片
dst_img = 'D:/python_2.jpg'
#目标图片大小
dst_w = 94
dst_h = 94
#保存的图片质量
save_q = 35
#裁剪压缩
clipResizeImg(ori_img=ori_img,dst_img=dst_img,dst_w=dst_w,dst_h=dst_h,save_q = save_q)
#等比例压缩
#resizeImg(ori_img=ori_img,dst_img=dst_img,dst_w=dst_w,dst_h=dst_h,save_q=save_q)
#水印
#waterMark(ori_img=ori_img,dst_img=dst_img,mark_img=mark_img,water_opt=water_opt)

总结

以上就是本文关于python使用pil进行图像处理(等比例压缩、裁剪)实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
浅谈Python中带_的变量或函数命名
Dec 04 Python
python爬虫获取京东手机图片的图文教程
Dec 29 Python
Python绘制的二项分布概率图示例
Aug 22 Python
解决python3 Pycharm上连接数据库时报错的问题
Dec 03 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
使用python实现画AR模型时序图
Nov 20 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
Django websocket原理及功能实现代码
Nov 14 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 Python
让Python更加充分的使用Sqlite3
Dec 11 #Python
pandas中Timestamp类用法详解
Dec 11 #Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 #Python
python实现二叉树的遍历
Dec 11 #Python
django上传图片并生成缩略图方法示例
Dec 11 #Python
使用Python的package机制如何简化utils包设计详解
Dec 11 #Python
python timestamp和datetime之间转换详解
Dec 11 #Python
You might like
PHP的cURL库简介及使用示例
2015/02/06 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
PHP5.3新特性小结
2016/02/14 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
Smarty模板配置实例简析
2019/07/20 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python实现Linux的find命令实例分享
2017/06/04 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
用Python实现读写锁的示例代码
2018/11/05 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
django rest framework 自定义返回方式
2020/07/12 Python
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
汉语言文学毕业生求职信
2013/10/01 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
大学生秋游活动方案
2014/02/17 职场文书
户外活动总结范文
2014/04/30 职场文书
升学宴学生答谢词
2015/01/05 职场文书
中小企业员工手册范本
2015/05/14 职场文书
承诺书应该怎么写?
2019/09/10 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js