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 初始化多维数组代码
Sep 06 Python
python中将字典转换成其json字符串
Jul 16 Python
Python标准库与第三方库详解
Jul 22 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
Apr 02 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
Pytorch 实现权重初始化
Dec 31 Python
Python3搭建http服务器的实现代码
Feb 11 Python
python logging.info在终端没输出的解决
May 12 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 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项目的方法
2006/10/09 PHP
php 删除无限级目录与文件代码共享
2008/11/22 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python统计一个文本中重复行数的方法
2014/11/19 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python性能提升之延迟初始化
2016/12/04 Python
遗传算法之Python实现代码
2017/10/10 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
学校办公室主任职责
2013/12/27 职场文书
西门豹教学反思
2014/02/04 职场文书
公司年终奖分配方案
2014/06/16 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
离婚协议书格式
2015/01/26 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python