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中的join()函数的用法
Apr 07 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
Python中属性和描述符的正确使用
Aug 23 Python
Flask之flask-session的具体使用
Jul 26 Python
python实现任意位置文件分割的实例
Dec 14 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
python 实现在一张图中绘制一个小的子图方法
Jul 07 Python
python2使用bs4爬取腾讯社招过程解析
Aug 14 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
基于PyTorch中view的用法说明
Mar 03 Python
详解Python生成器和基于生成器的协程
Jun 03 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中一个完整表单处理实现代码
2011/11/10 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
JavaScript中防止微信浏览器被整体拖动的方法
2017/08/25 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
python使用turtle库绘制时钟
2020/03/25 Python
Python编程深度学习计算库之numpy
2018/12/28 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
社区清明节活动总结
2014/07/04 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
主持人开幕词
2015/01/29 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
Python基础之Socket通信原理
2021/04/22 Python
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python