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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的urllib四大模块_Python常用的内建模块4:urllib

urllib提供了一系列用于操作URL的功能Geturllib的request模块可以非常方便的抓取URL的内容, 也就是发送一个GET请求到制定的页面, 然后返回HTTP的响应:例如, 对豆瓣的一个URLhttps://api.douban.com/v2/book/2129650进行抓取, 并返回响应:from urllib import requestwith reque…

Linux 升级 Python 至 3.x

原文链接&#xff1a;http://blog.csdn.net/liang19890820/article/details/51079633 -------------------------------------------- 简述 CentOS 7 中默认安装了 Python&#xff0c;版本比较低&#xff08;2.7.5&#xff09;&#xff0c;为了使用新版 3.x&#xff0c;需要对…

Sublime Text 3 配置python交互运行环境的快捷键

2019独角兽企业重金招聘Python工程师标准>>> 使用Sublime Text 3能以轻量级的环境写python脚本&#xff0c;运行python代码。为了更加方便地调用python脚本&#xff0c;通过在Sublime Text 3中绑定快捷键的方式&#xff0c;实现一键调用python交互运行环境&#xff…

xftp如何搜索文件_头条搜索站长平台如何添加网站和sitemap文件?附图文教程

头条搜索站长平台已经上线了&#xff0c;目前我们广大站长都可以登录该平台后添加新网站和提交 sitemap 地图文件&#xff0c;建议大家可以前往尝试一下&#xff0c;多一个搜索平台就多一条路&#xff0c;认为倒是挺好的。下面就跟大家简单介绍头条搜索站长平台如何添加网站和提…

Angular4中常用管道

原文链接&#xff1a;http://blog.csdn.net/haijing1995/article/details/71404350 ----------------------------------------------------- Angular4中常用管道 通常我们需要使用管道实现对数据的格式化&#xff0c;Angular4中的管道和之前有了一些变化&#xff0c;下面说一…

mysql死锁无法查询_MySQL死锁导致无法查询

客服反馈后台无法查询&#xff0c;原因大概知道&#xff0c;是因为MySQL的事务产生了死锁&#xff0c;以往都不知道是哪个事务锁住了&#xff0c;只能很粗暴地重启MySQL最近查找到一个方法&#xff0c;不用重启MySQL&#xff0c;记录如下登录到MySQL&#xff0c;来看下有哪些My…

彩铅练习,花船

图片发自简书App图片发自简书App

python 百度ocr识别_Python使用百度Ocr识别文字保存CSV

1.准备&#xff1a;1)Python开发环境, 笔者用的是3.7; 工具用的是Pycharm2)百度云后台创建文字识别的应用, 获取AppID, API key, Secret Key百度云后台创建文字识别的应用3) 百度模块pip install baidu-aip安装百度模块4) 要保存成csv需要用到pandas模块pip Install pandas安装…

chrome解决跨域(CORS)问题---chrome插件

1、chrome浏览器 chrome中跨域问题&#xff0c;可以安装插件解决&#xff0c; 插件地址 https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi 地址需要翻墙 翻墙hosts&#xff1a;https://laod.cn/hosts/2017-google-host…

我的女朋友漏电了–论C++中的失败(failure),缺陷(bug)和异常(exception)

先做个广告置入&#xff0c;如果喜欢这篇文章&#xff0c;你可以到 zhaoyan.website/blog 去查看于此类似的C/C文章。 我承认有点标题党了&#xff0c;不过这真的是一篇写软件的文章&#xff0c;所以如果你已经抽出了一张面巾纸&#xff0c;那么趁早再把它完美的放回去。这篇软…

SQLplus 和mysql区别_mysql和oracle的区别有哪些

MySQL和Oracle都是流行的关系数据库管理系统(RDBMS)&#xff0c;在世界各地广泛使用&#xff1b;大多数数据库以类似的方式工作&#xff0c;但MySQL和Oracle的这里和那里总是存在一些差异的。本篇文章就给大家比较Oracle和MySQL&#xff0c;介绍Oracle和MySQL之间的区别&#x…

127.0.0.1与localhost的区别

2019独角兽企业重金招聘Python工程师标准>>> 区别1&#xff1a; localhost也叫local &#xff0c;正确的解释是:本地服务器 127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器) 他们的解析通过本机的host文件&#xff0c;windows自动将localhost解析为127.…

一个项目经理的贪嗔痴

我有时候在想&#xff0c;自己到底是一个什么角色&#xff1f;产品经理&#xff1f;还是一个项目经理&#xff1f;或者只是一个技术经理。 身边一些朋友说&#xff0c;自己想转行做一个产品经理&#xff0c;做一个伟大的产品。我奉劝他们说还是省省吧&#xff0c;在这样一个二三…

mysql 索引_MySQL之索引

索引查找算法BTREEBTREE查找算法演变B-TREE &#xff1a;普通 BTREE&#xff0c;平衡多路查找树(B-Tree)BTREE &#xff1a;叶子节点双向指针BTREE(B*TREE)&#xff1a;枝节点的双向指针普通B-TREE增强版BTREE(B*TREE)总结&#xff1a;从上图看出&#xff0c;在BTree上有两个头…

2010年寒假学习心得

本人的博客园博客&#xff1a;http://www.cnblogs.com/zengmiaogen 博客园是我早期发表的博文。 ------------------------------------------ 1、心态要好&#xff0c;要相信自己能完成&#xff0c;不要担心自己完成不了&#xff0c;万事开头难&#xff0c;有挫折是正常的。…

利用5w1h写出高效的git commit

创建git commit 模板 创建模板 在个人目录下&#xff0c; 创建 .gitmessage vi .gitmessage 复制代码并输入以下信息 Who: Demand maker*When: versions affected*What:The content of the code changes* descrption: * wiki/task:Why:The reason*How:Influence of change* 复制…

python高维数据_t-SNE高维数据可视化(python)

t-SNE实践——sklearn教程t-SNE是一种集降维与可视化于一体的技术&#xff0c;它是基于SNE可视化的改进&#xff0c;解决了SNE在可视化后样本分布拥挤、边界不明显的特点&#xff0c;是目前最好的降维可视化手段。关于t-SNE的历史和原理详见从SNE到t-SNE再到LargeVis。代码见下…

java数学计算表达式_Java初学者:内建函数计算简单的数学表达式

这个应该在之前写的&#xff0c;忘记了&#xff0c;补上这次我们说一下如何用java计算数学表达式的值&#xff0c;比如&#xff0c;我们要计算sin(pi/3) cos(pi/6) 5.6^3&#xff0c;怎么计算呢&#xff1f;这里我们需要用到java的math的内建函数&#xff0c;所谓内建函数&am…

你是怎样的程序员?

一、程序员A 一个善于总结、能举一反三&#xff0c;敢于承担责任&#xff0c;敢于挑战自我&#xff0c;拥抱新技术的程序员&#xff0c;他的年龄意味着丰富经验&#xff0c;意味着效率。 他能指出并带人绕过一个一个技术大坑&#xff0c;笑看风云而不掉进去&#xff1b; 他能指…

谷歌新作gVisor:VM容器融合技术已经到来

作者&#xff5c;秦承刚&#xff0c;吴启翾&#xff0c;喻望&#xff0c;杨伟 编辑&#xff5c;张婵 出处丨高效开发运维 5 月 2 日&#xff0c;谷歌发布了一款新型的沙箱容器运行时 gVisor&#xff0c;号称能够为容器提供更安全的隔离&#xff0c;同时比 VM 更轻量。容器基于共…