zoukankan      html  css  js  c++  java
  • PIL包的应用

    PIL 是Python Imaging Library的简称,PIL是一个Python处理图片的库,提供过了一系列模块和方法。
    比如:裁切,平移,旋转,改变尺寸等。
    PIL有如下几个模块:Image模块、ImageChops模块、ImageCrackCode模块、ImageDraw模块、ImageEnhance模块、
    ImageFile模块、
    ImageFileIO等等

    最基本的导出图片

    from PIL import Image
    # 把图片输出并存为对象引用
    image = Image.open('shibie.png')
    

    以下就是一些应用

    
    from PIL import Image,ImageDraw
    # 把图片输出并存为对象引用
    image = Image.open('shibie.png')
    
    # 改变图片大小
    new_img = image.resize((256,256),Image.BILINEAR)
    # 保存图片
    new_img.save('2.jpeg')
    
    # 旋转图片
    new_img1 = image.rotate(45)
    # 保存图片
    new_img1.save('3.jpeg')
    
    # 直线绘制
    # PIL的ImageDraw模块提供了图形绘制的基本功能
    # 可以绘制直线,弧线,椭圆,矩形等等
    
    image_hz = Image.open("2.jpeg")
    draw = ImageDraw.Draw(image_hz) # 传入参数到模块ImageDraw中的Draw函数中
    width,height = image.size
    # 下面2句差不多
    draw.line(((0,0),(width-1,height-1)),fill = 255)
    draw.line(((0,height-1),(width -1 ,0)),fill = 255)
    image_hz.save("2.jpeg")
    
    # 绘制圆
    image_hzy = Image.open("shibie.png")
    draw = ImageDraw.Draw(image_hzy)
    width,height = image.size
    draw.arc((0,0,width-1,height-1),0,360,fill=255)
    image_hzy.save("4.jpeg")
    
    

    制作中文验证码实例(效果的话只能生成字母数字加干扰)==>代码待研究

    # 中文验证码实例(随机生成汉字,并加入一些干扰线条)
    from PIL import Image,ImageDraw,ImageFont,ImageFilter
    import random
    # import math
    
    _letter_cases = 'abcdefghjkmnpqrstuvwxy' # 小写字母,去除可能干扰的i,l,o,z
    _upper_cases = _letter_cases.upper() # 转化为大写字母
    _numbers  = "".join(map(str,range(3,10))) # 数字
    init_chars = ''.join((_letter_cases,_upper_cases,_numbers))
    fontType = r"‪C:\Windows\Fonts\FREESCPT.TTF"
    
    def create_validate_code(size=(120,30),
                            chars = init_chars,
                            img_type = 'PNG',
                            mode = "RGB",
                            bg_color = (255,255,255),
                            fg_color = (0,0,255),
                            font_size = 18,
                            font_type = fontType,
                            length  = 4,
                            draw_lines = True,
                            n_line = (1,2),
                            draw_points = True,
                            point_chance = 2):
                        """
                        size:图片的大小,格式(宽,高),默认为(120,30)
                        chars:允许的字符集合,始字符串
                        img_type:图片保存的格式,默认GIF
                        mode:图片模式,默认RGB
                        bg_color:背景颜色:默认白色
                        fg_color:前景色:验证码字符颜色,默认为蓝色#0000ff
                        font_size:验证码字体大小
                        font_type:验证码字体
                        length:验证码字符个数
                        draw_lines:是否划干扰线
                        n_lines:干扰线的条数范围,格式元组,默认为(1,2),只有draw_lines为True时有效
                        drwa_points:是否画干扰线
                        point_chance:干扰点出现的概率,大小范围[0,100]
                        return:[0]:PIL Image实例
                        return:[1]:验证码图片中的字符串
                        
                        """
                        width,height = size # 宽, 高
                        img = Image.new(mode,size,bg_color) # 创建图像
                        draw = ImageDraw.Draw(img) # 创建画笔
                        if draw_lines:
                            create_lines(draw,n_line,width,height)
                        if draw_points:
                            create_points(draw,point_chance,width,height)
                        strs = create_strs(draw,chars,length,font_type,font_size,width,height,fg_color)
    
                        # 图像扭曲参数
                        params = [1 - float(random.randint(1,2))/100,
                                  0,
                                  0,
                                  0, # 之前少了个0 # ValueError: wrong number of matrix entries
                                  1 - float(random.randint(1,10))/100,
                                  float(random.randint(1,2)/500),
                                  0.001,
                                  float(random.randint(1,2))/500      
                                   ]
                        img = img.transform(size,Image.PERSPECTIVE,params) #c
                        img = img.filter(ImageFilter.EDGE_ENHANCE) # 滤镜,边界加强(阈值更大)
                        return img,strs
    
    
    def create_lines(draw,n_line,width,height):
      '''绘制干扰线'''
      line_num= random.randint(n_line[0],n_line[1])# 干扰线条数
      for i in range(line_num):
        # 起始点
        begin= (random.randint(0, width), random.randint(0, height))
        #结束点
        end= (random.randint(0, width), random.randint(0, height))
        draw.line([begin, end], fill=(0,0,0))
    
    def create_points(draw,point_chance,width,height):
        """绘制干扰点"""
        chance  = min(100,max(0,int(point_chance))) # 大小限制在[0,100]
        for w in range(width):
            for h in range(height):
                tmp = random.randint(0,100)
                if tmp > 100 - chance:
                    draw.point((w,h),fill=(0,0,0))
    def create_strs(draw,chars,length,font_type,font_size,width,height,fg_color):
        """
        绘制验证码字符
        生成给定长度的字符串,返回列表格式
        """           
        c_chars= random.sample(chars,length)
        strs= ' %s ' % ' '.join(c_chars)# 每个字符前后以空格隔开
        
        font = ImageFont.truetype(font_type,font_size)
        font_width , font_height = font.getsize(strs)
    
        draw.text(((width-font_width)/3,(height-font_height)/3),strs,font=font,fill = fg_color)
    
        return ''.join(c_chars)
    
    if __name__ == "__main__":
        code_img = create_validate_code()
        code_img[0].save("1.png","PNG") # 难道是双引号的问题
        print(code_img[1])
                        
                                        
    
    

    初级教程可看pillow具体的初级教程

    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    SSM(六)JDK动态代理和Cglib动态代理
    SSM(三)Mybatis动态SQL
    MyBatis无限级分类实现的两种方法--自关联与map集合
    idea上MyBatis第一个例子
    idea 给maven项目添加依赖(二)
    idea 创建maven项目(一)
    Java学习笔记——三层架构
    MySQL实现自动使用uuid作为主键以及解决不能调用触发器的一点思路
    Java学习笔记——MySQL创建表结构
    jQuery入门——注册事件
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15124469.html
Copyright © 2011-2022 走看看