zoukankan      html  css  js  c++  java
  • python图像处理模块Pillow的学习

    https://blog.csdn.net/Richie_ll/article/details/69206210

    今天抽空学习了一下之前了解过的pillow库,以前看到的记得这个库可以给图片上加文字加数字,还可以将图片转化成字符画,不过一直没有找时间去学习一下这个模块,由于放假不用训练,所以就瞎搞了一下

    0、工欲善其事,必先利其器

    关于pillow库的安装有几种方式
    0、使用pip安装

    $ pip install pillow
    • 1

    1、使用easy_install

    $ easy_install pillow
    • 1

    2、通过pycharm安装

    1、学习并使用pillow库

    #导入模块
    from PIL import Image
    #读取文件
    img = Image.open('test.jpg')
    #保存文件
    #img.save(filename,format)
    img.save(filename,"JPEG")
    #获取图片大小
    (width,height) = img.size
    #获取图片的源格式
    img_format = img.format
    #获取图片模式,有三种模式:L(灰度图像),RGB(真彩色)和CMYK(pre-press图像)
    img_mode = img.mode
    #图片模式的转换
    img = img.convert("L")  #转化成灰度图像
    #获取每个坐标的像素点的RGB值
    r,g,b = img.getpixel((j,i))
    #重设图片大小
    img = img.resize(width,height)
    #创建缩略图
    img.thumbnail(size)

    2、实战演练

    将图片转化成字符画,效果如下:





    其实应该很容易想到,如果要达到这种效果,应该能想得到就是获取图上每一点的RGB值,然后根据这三种值确定这一点采用什么字符,其实根据RGB来确定的交灰值,所以可以将图片转化成灰度图片,来直接获取每一点的灰度,或者通过灰度的转换公式来使得RGB三值转化成灰度

    #coding:utf-8
    from PIL import Image
    #要索引的字符列表
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^`'. ")
    length = len(ascii_char)
    img = Image.open('03.jpg')      #读取图像文件
    (width,height) = img.size
    img = img.resize((int(width*0.9),int(height*0.5)))  #对图像进行一定缩小
    print(img.size)
    def convert(img):
        img = img.convert("L")  # 转为灰度图像
        txt = ""
        for i in range(img.size[1]):
            for j in range(img.size[0]):
                gray = img.getpixel((j, i))     # 获取每个坐标像素点的灰度
                unit = 256.0 / length
                txt += ascii_char[int(gray / unit)] #获取对应坐标的字符值
            txt += '
    '
        return  txt
    
    def convert1(img):
        txt = ""
        for i in range(img.size[1]):
            for j in range(img.size[0]):
                r,g,b = img.getpixel((j, i))           #获取每个坐标像素点的rgb值
                gray = int(r * 0.299 + g * 0.587 + b * 0.114)   #通过灰度转换公式获取灰度
                unit = (256.0+1)/length
                txt += ascii_char[int(gray / unit)]  # 获取对应坐标的字符值
            txt += '
    '
        return txt
    
    txt = convert(img)
    f = open("03_convert.txt","w")
    f.write(txt)            #存储到文件中
    f.close()

    给图片加上文字(福利预警,前方有福利!!!!)

    #coding:utf-8
    from PIL import Image,ImageDraw,ImageFont
    
    #http://font.chinaz.com/zhongwenziti.html 字体下载网站
    
    img = Image.open('PDD01.jpg')
    draw = ImageDraw.Draw(img)
    myfont = ImageFont.truetype('HYLiuZiHeiJ.ttf',size=80)
    fillcolor = 'pink'
    (width, height) = img.size
    #第一个参数是加入字体的坐标
    #第二个参数是文字内容
    #第三个参数是字体格式
    #第四个参数是字体颜色
    draw.text((40,100),u'萌萌哒',font=myfont,fill=fillcolor)
    img.save('modfiy_pdd01.jpg','jpeg')


    给图片加上数字

    这个大家应该见过的,就是有些头像的左上角的那个小红圈加上白色的数字,其实方法和上面那个加文字的差不多

    讲道理,我还不如用ps,移坐标移到要死要死的

    #coding:utf-8
    from PIL import Image,ImageDraw,ImageFont
    img = Image.open("03.jpg")
    draw = ImageDraw.Draw(img)
    myfont = ImageFont.truetype(u"时光体.ttf",50)
    (width,height) = img.size
    draw.ellipse((width-40,0,width,40),fill="red",outline="red")   #在图上画一个圆
    draw.text((width-30,-8),'1',font=myfont,fill='white')
    img.save('03_modify.jpg')

    生成4位随机验证码

    #coding:utf-8
    from PIL import Image,ImageDraw,ImageFont,ImageFilter
    import random
    """
    创建四位数的验证码
    """
    #产生随机验证码内容
    def rndTxt():
        txt = []
        txt.append(random.randint(97,123))      #大写字母
        txt.append(random.randint(65,90))       #小写字母
        txt.append(random.randint(48,57))       #数字
        return chr(txt[random.randint(0,2)])
    
    #随机颜色(背景)
    def rndColor1():
        return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
    
    #随机颜色(字体)
    def rndColor2():
        return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
    
    #240x60:
    width = 60*4
    height = 60
    img = Image.new('RGB',(width,height),(255,255,255))
    font = ImageFont.truetype(u'时光体.ttf',36)
    draw = ImageDraw.Draw(img)
    #填充每个像素
    for x in range(width):
        for y in range(height):
            draw.point((x,y),fill=rndColor1())
    
    #输出文字
    for txt in range(4):
        draw.text((60*txt+10,10),rndTxt(),font=font,fill=rndColor2())
    #模糊化处理
    #img = img.filter(ImageFilter.BLUR)
    img.save("code.jpg")
  • 相关阅读:
    jupyter同时使用python2、3
    [python之ipython] jupyter notebook在云端服务器上开启,本地访问
    Transformer的PyTorch实现--转载
    二叉树中和为某一值的路径
    hadoop初识笔记
    大数据初识笔记
    mysql快速入门笔记
    118.Java反射-工厂模式
    117.Java观察者设计模式
    116.Java对象的拷贝
  • 原文地址:https://www.cnblogs.com/LewisAAA/p/9246491.html
Copyright © 2011-2022 走看看