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

[经验分享] Python 趣味练习- 修改图片

[复制链接]

尚未签到

发表于 2018-8-12 12:37:37 | 显示全部楼层 |阅读模式
  无聊在Github上看见python的趣味练习题,自己试着做了做
  https://github.com/Yixiaohan/show-me-the-code
  第 0000 题: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。
  这个题目主要是练习对Pillow模块的使用,豆子之前也没用过,今天试了试发现很强大也很方便
  首先安装
C:\Users\yuan.li>pip install pillow  
Collecting pillow
  
  Downloading Pillow-4.3.0-cp36-cp36m-win32.whl (1.4MB)
  
    100% |████████████████████████████████| 1.4MB 654kB/s
  
Collecting olefile (from pillow)
  
  Downloading olefile-0.44.zip (74kB)
  
    100% |████████████████████████████████| 81kB 2.8MB/s
  
Building wheels for collected packages: olefile
  
  Running setup.py bdist_wheel for olefile ... done
  
  Stored in directory: C:\Users\yuan.li\AppData\Local\pip\Cache\wheels\20\58\49\cc7bd00345397059149a10b0259ef38b867935ea2ecff99a9b
  
Successfully built olefile
  
Installing collected packages: olefile, pillow
  
Successfully installed olefile-0.44 pillow-4.3.0
  这个模块可以帮助我们读取和修改图片。为了完成上面的任务,我们需要了解一些基本的模块使用
  https://pillow.readthedocs.io/en/4.3.x/index.html
  首先看看Image 模块,他的主要作用就是读取一个图片,然后可以打开或者另存为其他格式。
  例1
from PIL import Image  
im=Image.open('c:\\temp\\download.png','r')
  
print(im.format, im.size, im.mode)
  
#把图片保存为临时文件打开
  
im.show()
DSC0000.png

  例2, 再例1 的基础上做些修改,这次我们把打开的文件另存为jpg的格式
import os, sys  
from PIL import Image
  
#对每一个参数
  
for infile in sys.argv[1:]:
  
    f, e = os.path.splitext(infile)
  
    outfile = f + ".jpg"
  
    print(infile,outfile)
  
    if infile != outfile:
  
        try:
  
            #需要先转换格式为RGB,否则PNG格式无法直接转换为JPEG
  
            Image.open(infile).convert('RGB').save(outfile)
  
        except IOError:
  
            print("cannot convert", infile)
  例3, 打开图片的方式和打开普通文件的方式一样,也可以用with as的格式
import sys  
from PIL import Image
  
for infile in sys.argv[1:]:
  
    try:
  
        with Image.open(infile) as im:
  
            print(infile, im.format, "%dx%d" % im.size, im.mode)
  
    except IOError:
  
        pass
  例4,我们还可以对图片进行剪切
im= Image.open('c:\\temp\d1.png')  
box = (50, 50, 100, 100)
  
region = im.crop(box)
  
region.show()
  
region.transpose(Image.ROTATE_180)
  
region.show()
  
im.paste(region,box)
  
im.show()
  第二个很重要的模块是ImageDraw模块,这个可以让我们对图片和文字进行创建和二次加工
  例5,打开一个图片,在上面画线
from PIL import Image, ImageDraw  
import sys
  
im = Image.open("c:\\temp\\d1.jpg")
  
print(im.size)
  
draw = ImageDraw.Draw(im)
  
#元组相加等于一个合并的元组,这里设置划线的起始坐标和重点坐标, 注意x坐标是向下跑的 fill里面设置RGBA的值
  
draw.line(((0, 0) + im.size), fill=(340,83,45),width=10)
  
draw.line((0, im.size[1], im.size[0], 0), fill=128)
  
del draw
  
im.show()
  
im.save("c:\\temp\\d10.png")
DSC0001.png

  例6. 在图片上写字 (题目要求)注意我们这里还调用了ImageFont 模块, 他的作用就是处理位图字体
from PIL import Image, ImageDraw, ImageFont  

  
# 首先打开一图片,转换为RGBA方便保存和修改
  
base = Image.open('c:/temp/d1.png').convert('RGBA')
  

  
# 这里创建了一个同样大小的空白文件
  
txt = Image.new('RGBA', base.size, (255,255,255,0))
  

  
# 获取字体类型,大小
  
fnt = ImageFont.truetype('c:/windows/fonts/arial.ttf', 40)
  

  
# 准备修改这个图片
  
d = ImageDraw.Draw(txt)
  

  
# 指定坐标写字,颜色用RGBA来显示
  
d.text((10,10), "Hello", font=fnt, fill=(340,83,45,255))
  

  
# 指定坐标写字,颜色用RGBA来显示
  
d.text((100,60), "World", font=fnt, fill=(255,255,255,255))
  

  
#alpha通道组合2个图片,要求图片大小一致,都使用了RGBA
  
out = Image.alpha_composite(base, txt)
  
out.show()
DSC0002.png

  例6里面我们使用了一个函数alpha_composite,他的意思是 alpha通道混合图像
  注意RGBA的A就是指Alpha通道,一般理解为透明度的设置
  下面是如何根据Alpha通道数据进行图像混合的算法:
  事实上,我们把需要组合的颜色计算出不含Alpha分量的原始RGB分量然后相加便可。如:两幅图像分别为A和B,由这两幅图像组合而成的图像称为C,则可用如下四元组表示图A和B,三元组表示图像C:
  A:(Ra,Ga,Ba,Alphaa)
  B:(Rb,Gb,Bb,Alphab)
  C:(Rc,Gc,Bc)
  根据上述算法,则:
  Rc=Ra*Alphaa+Rb*Alphab
  Gc=Ga*Alphaa+Gb*Alphab
  Bc=Ba*Alphaa+Bb*Alphab
  这就是两图像混合后的三原色分量。如果有多幅图像需要混合,则按照以上方法两幅两幅地进行混合。

运维网声明 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-550624-1-1.html 上篇帖子: python requests自定义方法 下篇帖子: Python -- 正则表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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