设为首页 收藏本站
查看: 1135|回复: 0

[经验分享] python PIL模块

[复制链接]

尚未签到

发表于 2018-8-8 08:05:22 | 显示全部楼层 |阅读模式
# -*-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其实也是image对象了。抠图
  
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()            # 抽取出透明通道中的图片并显示

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548406-1-1.html 上篇帖子: python实现斐波那契数列 下篇帖子: python基础—python最重要的,库/模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表