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内置模块turtle绘图详解

Python中pygal绘制雷达图代码分享

python自动裁剪图像代码分享

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

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

本文地址: http://www.cppcns.com/jiaoben/python/214041.html

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

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

    PIL中设计的几个基本概念 1.通道(bands):即使图像的波段数,RGB图像,灰度图像 以RGB图像为例: 2.模式(mode):定义了图像的类型和像素的位宽.共计9种模式: 3.尺寸(size) ...

  2. python爬取音乐排行_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  3. python判断性别的源代码_python 通过手机号识别出对应的微信性别(实例代码)

    python 通过手机号识别出对应的微信性别,详细代码如下所述: def getGender(self,tel): self.d(resourceId="com.tencent.mm:id/ ...

  4. python保存为mat文件_Python读取mat文件保存为pickle格式的实例代码

    Python使用pickle模块储存对象操作 Python读取mat文件,并保存为pickle格式的方法 这两天在搞Theano,要把mat文件转成pickle格式载入Python. Matlab是把 ...

  5. python 抓包解析数据_Python抓包并解析json爬虫的完整实例代码

    Python抓包并解析json爬虫 在使用Python爬虫的时候,通过抓包url,打开url可能会遇见以下类似网址,打开后会出现类似这样的界面,无法继续进行爬虫: 例如: 需要爬取网页中第二页的数据时 ...

  6. python怎么通过手机号定位_python 通过手机号识别出对应的微信性别(实例代码)

    python 通过手机号识别出对应的微信性别,具体代码如下所述: def getGender(self,tel): self.d(resourceId="com.tencent.mm:id/ ...

  7. python文件夹自动备份_python实现定时自动备份文件到其他主机的实例代码

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. 树莓派退出python的代码_Python实现树莓派WiFi断线自动重连的实例代码

    实现 WiFi 断线自动重连.原理是用 Python 监测网络是否断线,如果断线则重启网络服务. 1.Python 代码 autowifi.py,放在 /home/pi 目录下: #!/usr/bin ...

  9. python怎么跳转到某一行代码_Python中免验证跳转到内容页的实例代码

    在本篇文章里小编给大家整理的是一篇关于Python中免验证跳转到内容页的实例代码,有兴趣的朋友们可以学习分享下. 相信很多人在浏览网页时,经常会碰到需要输入验证码才可以继续浏览的情况吧,遇到这种问题, ...

最新文章

  1. C++ 对引用的深入理解
  2. mysql中tonumber函数_Oracle数据库之oracle的TO_NUMBER函数
  3. 骨架提取的MATLAB实现
  4. 4g模块注册上网 移远_Openwrt实现4G模块上网功能
  5. 操作系统原理第一章:操作系统概述
  6. MySQL 优化原理(三)
  7. PHP(二)——HTML基础
  8. Openshift:使用Java 8在Wildfly 8.2.0上构建Spring Boot应用程序
  9. “超大杯”版小米10不仅有120W超级快充,电池也要比传闻大
  10. 计算机键盘无法识别,电脑插上键盘显示无法识别USB?
  11. win2012服务器 注册表,第十一章 Windows Server 2012 R2 注册表域注册表编辑器 ---学习笔记...
  12. 大数据Hive搭建部署常见报错信息原因
  13. sklearn学习-SVM例程总结2(特征选择——单因素方差分析(方差分析anova ))
  14. laravel-excel使用2(老猫包子店的故事)
  15. 他的成功不可复制——听洪小文讲座有感
  16. 【附源码】计算机毕业设计SSM物料追溯系统
  17. 小黑NLPbaseline成长日记1:Skip_Gram+NEG的pytorch练习
  18. 实用最优化方法课后习题-第三章
  19. Girlfriend(2021牛客多校第二场F)
  20. 【系统分析师之路】第十九章 知识产权与标准化(章节重点)

热门文章

  1. 接口测试用python怎么做_请问一下python怎么做接口测试工具?
  2. php自然排序法的比较过程,PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)...
  3. java成员内部类_Java中的内部类(二)成员内部类
  4. 杨宏宇:腾讯多模态内容理解技术及应用
  5. html dom透明度,HTML DOM Style overflow 属性
  6. oracle迁移undo表空间,oracle切换undo表空间
  7. mysql多客户端数据不同步_一种多终端设备上的数据同步方法
  8. ubunt16.04 安装3090显卡驱动 cuda cudnn pytorch
  9. DOCKERFILE参数注解
  10. 配置文件bashrc与profile的区别