专栏首页python3python PIL模块

python PIL模块

http://onlypython.group.iteye.com/group/wiki/1372-python-graphics-p_w_picpath-processing-library-introduced-the-p_w_picpath-module

http://onlypython.group.iteye.com/group/wiki/1371-python-graphics-library-pil-python-p_w_picpath-library-introduction

# -*-coding:utf-8 -*-
__author__ = 'Administrator'
from PIL import Image
from PIL import ImageFilter
from PIL import ImageEnhance

im = Image.open("C:/1.jpg")
print im.size, im.format, im.mode, im.info
# im.show() convert()可以用来转换色彩模式
# 设置拷贝区域, box变量是四元组(左,上,右,下)
box = (100, 100, 200, 200)
# 复制抠图 将im表示的图片对象拷贝到region中,大小(400*400),region其实也是p_w_picpath对象了。抠图
region = im.crop(box)
region = region.transpose(Image.ROTATE_180)  # 旋转方向
# 粘贴 母图.粘贴(子图,位置)
im.paste(region, box)
# 保存
im.save('C:/2.jpg')
# 分离三通道,红绿蓝
r, g, b = im.split()
# 保存查看之。直接调用show也可,但是windows不好用
r.save('C:/r.jpg')
# 调整图片大小
out = im.resize((128, 128))
# 图片逆时针旋转
out = im.rotate(45)
# 保存查看
out.save('C:/out.jpg')
# 各种翻转效果,镜面效果可以用transpose()预定义的旋转方式
reset = im.transpose(Image.FLIP_LEFT_RIGHT)  # 左右镜像
reset = im.transpose(Image.FLIP_TOP_BOTTOM)  # 上下镜像
reset = im.transpose(Image.ROTATE_270)

# 图像增强-滤镜filter
out = im.filter(ImageFilter.DETAIL)
out.save('C:/out3.jpg')
# 对每个点都做20%的增强
out = im.point(lambda i: i * 1.2)  # 注意这里用到一个匿名函数(那个可以把i的1.2倍返回的函数)
# 如上上边的那个例子,我们可以将一个RGB模式的图分离成三个通道的层
# 然后对一个通道进行加强或减弱操作,完成后我们又可以使用Merge将通道合并,从而改变图片的色调(冷暖色调的互换)等。
#### 点操作 #####
# img.point(function),这个function接受一个参数,且对图片中的每一个点执行这个函数,这个函数是一个匿名函数,在python之类的函数式编程语言中,可以使用
# lambda表达式来完成,如
# out = img.point(lambda i : i*1.2)#对每个点进行20%的加强
# 如果图片是“I”或者“F”模式,那么这个lambda必须使用这样的形式
# argument * scale + offset
# e.g
# out = img.point(lambda i: i*1.2 + 10)
#############
r = r.point(lambda i: i * 1.2)
g = g.point(lambda i: i * 0.7)
sexy = Image.merge('RGB', (r, g, b))
sexy.save("C:/sexy.png")
# 创建mask的语句:
mask = r.point(lambda i: i < 100 and 255)
# 该句可以用下句表示
# imout = im.point(lambda i: expression and 255)
# 如果expression为假则返回expression的值为0(因为and语句已经可以得出结果了),否则返回255。(mask参数用法:当为0时,保留当前值,255为使用paste进来的值,中间则用于transparency效果)
# 更高级的图片加强,可以使用ImageEnhance模块,其中包含了大量的预定义的图片加强方式。一旦有一个Image对象,
# 应用ImageEnhance对象就能快速地进行设置。 可以使用以下方法调整对比度、亮度、色平衡和锐利度。
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")
# 创建一个新的图片
# Image.new(mode, size)
# Image.new(mode, size, color)
# 层叠图片
# 层叠两个图片,img2和img2,alpha是一个介于[0,1]的浮点数,如果为0,效果为img1,如果为1.0,效果为img2。当然img1和img2的尺寸和模式必须相同。这个函数可以做出很漂亮的效果来,而图形的算术加减后边会说到。
# Image.blend(img1, img2, alpha)
# composite可以使用另外一个图片作为蒙板(mask),所有的这三张图片必须具备相同的尺寸,mask图片的模式可以为“1”,“L”,“RGBA”(关于模式请参看前一篇)
# Image.composite(img1, img2, mask)
# 转换图形模式
# 下面看一个比较牛的方法convert,这个方法可以将图片在不同的模式间进行转换,在将灰度图转换成二值图时,所有的非零值被设置为255(白色)。灰度图的转换方式采用的是这个算法:
# L = R*299/1000 + G*587/1000 + B*114/1000

# 透明通道的使用
# putalpha(alpha)
# 这个方法是一个神奇的方法,你可以将一个图片(与原图尺寸相同)写入到原图片的透明通道中,而不影响原图片的正常显示,可以用于信息隐藏哦。当然,前提是原
# 始图片有透明通道。不过就算不是也没有多大关系,因为有PIL提供的convert功能,可以把一个图片先转换成RGBA模式,然后把要隐藏的信息文件转成“L”或者“1”模
# 式,最后使用这个putalpha将其叠加。而在图片的使用方,只需要简单的抽取其中的透明通道就可以看到隐藏信息了,哈哈。

def hideInfoInImage(im, info):
    if im.mode != "RGBA":
        im = im.convert("RGBA")
    if info.mode != "L" and info.mode != "1":
        info = info.convert("L")
    im.putalpha(info)
    return im


# 测试之
if __name__ == "__main__":
    img = Image.open("green.png")
    band = Image.open("antelope_inhalf.jpg")

    img = hideInfoInImage(img, band)
    img.show()                       # 可以看到,原图片没有显式变化
    img.split()[3].show()            # 抽取出透明通道中的图片并显示

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【漏洞实战】Apache Shiro反序列化远程代码执行复现及“批量杀鸡”

    利用vmware workstation,安装一个操作系统,执行以下指令,更换系统源,并且安装docker

    用户1631416
  • php yield关键字以及协程的实现

    php的yield是在php5.5版本就出来了,而在初级php界却很少有人提起,我就说说个人对php yield的理解

    仙士可
  • PHP 到底是不是宇宙第一?TIOBE 排行榜来证明!

    做为一名程序员,都比较关注其使用编程语言的热度,一方面编程语言的热度决定了它拥有多大的市场,另一方面也关系到行业内程序员选择机会有多大。

    用户6543014
  • 使用 uWSGI + Nginx 部署 Flask 应用

    在这篇文章之前,所有的应用都是在命令行使用 Python 直接运行的,但是这种方式只适合在开发过程中使用,并不适合在生产环境中使用,在生产环境中可以使用 uWS...

    keinYe
  • narrow,broad, gapped peak:三种格式之间的区别与联系

    peak被定义为基因组上一段reads富集的区域,核心信息是在染色体上的起始和终止位置,除此之外,还有软件对于该peak区域的打分,比如常见的pvalue, q...

    生信修炼手册
  • Juicer软件的安装详解

    软件安装是生物信息实战中最基础的技能之一,只有确保软件安装无误,后续使用起来才会得心应手,不会有很多的bug。juicer软件提供了Hi-C数据一键化分析的pi...

    生信修炼手册
  • Django容器(上): 自定义基础镜像

    某个 Python 项目,基于 Python:3.6 与 Django:1.11 框架开发,希望项目能够容器化,然后可以通过 docker-compose 等工...

    用户1560186
  • Python数据库测试实战指南

    我们在细化成具体的就是,我们需要验证表结构、字段、长度、主键、索引、unique等等属性。

    苦叶子
  • GitHub 长期被中国人“霸榜”?看完榜单我呆了...

    作为「技术行业观察者」的我,平时经常会逛 GitHub 找选题,最近我又在上面发现了很多宝藏...或者叫大宝箱...

    Rocky0429
  • 教你写出可读性高的Python代码

    来源:https://learnku.com/docs/python-guide/2018/writing-style/3261

    Python编程与实战

扫码关注云+社区

领取腾讯云代金券