您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net:未读音讯,每一日贰个小程序

新葡亰496net:未读音讯,每一日贰个小程序

发布时间:2019-08-02 12:53编辑:奥门新萄京娱乐场浏览(105)

    题目

    Python 练习册,每天一个小程序----第0000题,python0000

    题目

    第 0000 题: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果

    新葡亰496net 1

     

    Code:

     1 from PIL import Image,ImageDraw,ImageFont
     2 # path = "F:Python LearningPython_Exercise"
     3 # 读取图片数据
     4 iconPath = r"ImageWeChart.png"
     5 # labelPath = r"Image圆圈.png"
     6 iconImage=Image.open(iconPath,'r')
     7 # labelImage = Image.open(labelPath,"r")
     8 
     9 # # 标签上写字
    10 # user_font = ImageFont.truetype('simsun.ttc',80)
    11 # draw = ImageDraw.Draw(labelImage)
    12 # draw.text((int(labelImage.size[0]/4),int(labelImage.size[1]/7)),u'24',font=user_font)
    13 # labelImage.save("final.png","PNG")
    14 
    15 # 组合Icon
    16 icon = Image.new("RGBA",(iconImage.size[0] 105,iconImage.size[1] 105))
    17 # iconImage.paste(labelImage,(int(iconImage.size[0]-labelImage.size[0]/2-1),0))
    18 # iconImage.save("final.png","PNG")
    19 # 右上角数字标签会导致图片尺寸变大
    20 icon.paste(iconImage,(0,54))
    21 draw = ImageDraw.Draw(icon)
    22 # 直接在图片上画圆
    23 draw.ellipse([(iconImage.size[0]-100,5),(iconImage.size[1] 100,205)],"red")
    24 user_font = ImageFont.truetype('simsun.ttc',100)
    25 # 标注数字
    26 draw.text((iconImage.size[0]-50,50),u'24',"white",font=user_font)
    27 icon.save("final.png","PNG")
    

    Result:

    新葡亰496net 2

    总结:

    Pillow API 学习

    API 文档路径:

     

    (1) PIL.Image.new(mode,size,color)

      mode: 新图片的模式,如RGB,灰度图相等

      size: 新图象的尺寸,元组对象(a,b)

      color: 图像的填充对象

      返回图像对象

    (2) Image.size

      获取图像尺寸,返回的是元组对象

      由于返回是元组对象,则访问结果是Image.size[0]

    (3) ImageDraw.Draw(im,mode=None)

      创建可在图片上进行绘制Draw对象

    (4) Image.paste(sourceImg,box=None,mode=None)

      将一张图片粘贴到另一张图片上

      Image对象指的是被粘贴的图片

      sourceImg: 粘贴的源图片

      box: 2元组则是粘贴图片位置的左上角开始位置

        4元组则是左上角,同时包括右下角,必须符合源图片的尺寸内

      mode:图片模式

    (5) ImageFont.trueType(font=None,size=None,index=0,filename=None)

      设置图片上字体

      filename: 设置字体文件,如若没有则是找Window字体

      size: 字体大小

    (6) ImageDraw.Draw.eclipse(xy,fill=None,outline=0)

      图片上绘制椭圆

      xy:两种方式

        [(x0,y0),(x1,y1)],[x0,y0,x1,y1]左上角,右上角坐标

      如果要画圆形则是保证两轴长度相等

      fill: 椭圆内部是否填充,填充色

      outline:椭圆轮廓宽度

     

    (7) ImageDraw.text(xy,text,fill=None,font=None)

      xy: 字的右上角的位置

      text:书写的问题,注意编码格式

      fill:文本的颜色

      font:引入字体

     

    编码经验的总结

    (1) 如果不是矢量图可能会造成叠加图片未着色遮盖,故最终选择两个图片叠加,而是直接在图片上绘制圆形

    (2) 关于图片字体仍然还需进一步的学习,因为想引入微软雅黑,结果没成功,还有就是如何加粗?

    (3)   如何让文字自适应在图片中间,C 中有获取字体的像素大小,还得再研究Pillow是否有这个函数?

    拓展

    (1) 如何抹去上面的数字标签,模拟微信已读

    (2) 如何更新上面的数字,模拟不断接受新的消息,未读

    思路:

    code改编为函数,输入参数为未读消息数据,获取原始图片的画笔

    新葡亰496net 3

     

    事件响应传入相应的参数

    练习册,每天一个小程序----第0000题,python0000 题目 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未...

    Python 练习册 的第0000题
    描述:将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果

    第0000题:将你的QQ头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。

    20180110

    '''
    0、将你的 QQ 头像(或者微博头像)右上角加上红色的数字,
    类似于微信未读信息数量那种提示效果。
    '''

    from PIL import Image, ImageDraw, ImageFont
    

    第 0000 题: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果

    新葡亰496net 4

    本题用了Python中最常用的图像处理库PIL,推荐阅读官方文档

    添加对角线

    '''
    draw.arc(xy, start, end, options)
    含义:在给定的区域内,在开始和结束角度之间绘制一条弧(圆的一部分)。
    变量options中fill设置弧的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    print(im.size)
    draw = ImageDraw.Draw(im)
    draw.line((0,0)   im.size, fill = 28)
    draw.line((im.size[1],0)   (0,im.size[0]), fill = 200 )
    im.show()
    del draw
    

    新葡亰496net 5

    效果展示

    处理思路:

    1. 通过Image类中的open方法载入图像文件并用Image类的size属性获取图片大小
    2. 用ImageFont类的truetype方法载入字体并设置字体大小
    3. 用ImageDraw类的Draw方法在图片左上角加上数字
    4. 保存加上数字的图片

    示例代码如下:

    添加弧角

    '''
    draw.arc(xy, start, end, options)
    变量xy是需要设置一个区域,此处使用4元组,包含了区域的左上角和右下角两个点的坐标。
    弧都是按照顺时针方向绘制的
    可绘制圆以及椭圆
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.arc((0,0,200,200),0,90,fill = 222)#圆
    draw.arc((200,200,400,500),0,-90,fill = 222)#椭圆
    draw.arc((200,200,300,300),-90,0,fill = 222)#圆
    im.show()
    del draw
    

     


    ! /usr/bin/env python

    Pieslice

    '''
    定义:draw.pieslice(xy,start, end, options)
    含义:和方法arc()一样,但是在指定区域内结束点和中心点之间绘制直线。
    变量options的fill给定pieslice内部的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.pieslice((0,0,200,200),0,90,fill = 222)#扇形
    draw.pieslice((200,200,400,500),0,-90,fill = 222)#椭圆扇形
    draw.pieslice((200,200,300,300),-90,0,fill = 222)#圆扇形
    im.show()
    del draw
    

    Code:

    既然是图像处理,我觉得 PIL 可以胜任,如果是初步上手,可以看看 廖雪峰的Python教程 - PIL。当然,光是教程里使用的函数是不够用的,所以再查查官方的文档。
    我上下翻阅文档觉得可以使用以下函数:

    coding=utf-8

    from PIL import Image, ImageDraw, ImageFont

    def add_num(picPath, num):
    img = Image.open(picPath)
    x, y = img.size
    myFont = ImageFont.truetype('verdana.ttf', x/3)
    ImageDraw.Draw(img).text((2*y/3, 0), str(num), fill='red', font=myFont)
    img.save('pic_with_num.jpg')

    if name == 'main':
    add_num('in.jpg', 9)

    Chord

    '''
    定义:draw.chord(xy,start, end, options)
    含义:和方法arc()一样,但是使用直线连接起始点。
    变量options的outline给定弦轮廓的颜色。Fill给定弦内部的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.chord((0,0,200,200),0,90,fill=128,outline=222)
    im.show()
    del draw
    
     1 from PIL import Image,ImageDraw,ImageFont
     2 # path = "F:Python LearningPython_Exercise"
     3 # 读取图片数据
     4 iconPath = r"ImageWeChart.png"
     5 # labelPath = r"Image圆圈.png"
     6 iconImage=Image.open(iconPath,'r')
     7 # labelImage = Image.open(labelPath,"r")
     8 
     9 # # 标签上写字
    10 # user_font = ImageFont.truetype('simsun.ttc',80)
    11 # draw = ImageDraw.Draw(labelImage)
    12 # draw.text((int(labelImage.size[0]/4),int(labelImage.size[1]/7)),u'24',font=user_font)
    13 # labelImage.save("final.png","PNG")
    14 
    15 # 组合Icon
    16 icon = Image.new("RGBA",(iconImage.size[0] 105,iconImage.size[1] 105))
    17 # iconImage.paste(labelImage,(int(iconImage.size[0]-labelImage.size[0]/2-1),0))
    18 # iconImage.save("final.png","PNG")
    19 # 右上角数字标签会导致图片尺寸变大
    20 icon.paste(iconImage,(0,54))
    21 draw = ImageDraw.Draw(icon)
    22 # 直接在图片上画圆
    23 draw.ellipse([(iconImage.size[0]-100,5),(iconImage.size[1] 100,205)],"red")
    24 user_font = ImageFont.truetype('simsun.ttc',100)
    25 # 标注数字
    26 draw.text((iconImage.size[0]-50,50),u'24',"white",font=user_font)
    27 icon.save("final.png","PNG")
    
    • PIL.Image.open(fp, mode='r') 打开并辨认出图片,生成图片对象
    • PIL.ImageDraw.Draw.text(xy,text, fill=None, font=None, anchor=None) 用来为图片对象绘制数字
    • PIL.ImageDraw.Draw.pieslice(xy, start, end, fill=None, outline=None) 用来为图片对象绘制扇形(圆形也就是特殊的扇形辣)
    • PIL.ImageFont.truetype(font=None, size=10, index=0, encoding='') 用来读取 TrueType 和 OpenType 字体文件,同时生成字体对象,还能设定字体对象的大小

    主要类的说明:

    PIL的主要功能定义在Image类当中,而Image新葡亰496net,类定义在同名的Image模块当中。使用PIL的功能,一般都是从新建一个Image类的实例开始。新建Image类的实例有多种方法。你可以用Image模块的 open()函数打开已有的图片档案,也可以处理其它的实例,或者从零开始构建一个实例。
    from PIL import Image
    sourceFileName = "source.png"
    avatar = Image.open(sourceFileName)

    Ellipse

    '''
    定义:draw.ellipse(xy,options)
    含义:在给定的区域绘制一个椭圆形。
    变量options的outline给定椭圆形轮廓的颜色。Fill给定椭圆形内部的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.ellipse((0,0,200,200),fill=123)
    draw.ellipse((200,200,300,400),fill=123)
    im.show()
    del draw
    

    Result:


    查看实例的属性

    Image 类的实例有5个属性,分别是:

    • format: 以 string 返回图片档案的格式(JPG, PNG, BMP, None, etc.);如果不是从打开文件得到的实例,则返回 None。
    • mode: 以 string 返回图片的模式(RGB, CMYK, etc.);完整的列表参见 官方说明·图片模式列表
    • size: 以二元 tuple 返回图片档案的尺寸 (width, height)
    • palette: 仅当 mode 为 P 时有效,返回 ImagePalette 示例
    • info: 以字典形式返回示例的信息

    Polygon

    '''
    定义:draw.polygon(xy,options)
    含义:绘制一个多边形。
    多边形轮廓由给定坐标之间的直线组成,在最后一个坐标和第一个坐标间增加了一条直线,形成多边形。
    坐标列表是包含2元组[(x,y),…]或者数字[x,y,…]的任何序列对象。它最少包括3个坐标值。
    变量options的fill给定多边形内部的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.polygon([(0,0),(100,50),(50,100)],fill=123)
    draw.polygon([0,20,50,90,100,300,200,80],fill=222)
    im.show()
    del draw
    

    新葡亰496net 6

    代码演示

    代码是基于 Python3 的,Python2 的 PIL 模块有所不同。

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    from PIL import Image, ImageDraw, ImageFont
    
    im = Image.open("test.jpeg")  # 创建图片对象
    w,h = im.size  # 获取图片对象的宽和高
    font = ImageFont.truetype('/Library/Fonts/Arial Rounded Bold.ttf', int(h/4))
    # 创建字体对象,我把字体的大小设为高度1/4,如果数字多于个位应该再小点
    
    ImageDraw.Draw(im).pieslice([(w/3*2, 0), (w, h/3)], 0, 360, fill="red")
    # 绘制圆形,第一个参数界定绘制区域,我选择了宽高为原图1/3的右上角区域
    # 不难发现坐标系是以左上角为原点,向下y递增,向右x递增
    ImageDraw.Draw(im).text((w * 0.76, h * 0.02), '5', font=font, fill="white")
    # 第一个参数是坐标,第二个参数是文本绘制内容,第三个是字体对象
    
    im.show()  # 展示绘制结果(使用系统默认的图片浏览器)
    #当然也可以用im.save()函数保存结果
    

    让我们测试一下:

    新葡亰496net 7

    处理前

    新葡亰496net 8

    处理后

    效果还不错。
    共计7行代码就完成了这个功能,当然通过修改可以写成命令行脚本、批处理脚本,或者更加智能化。

    ImageDraw 模块

    ImageDraw模块提供了Draw类,它能在Image实例上进行简单的 2D 绘图。当然复杂的绘图动作是由简单的动作合成而得的,理论上这些动作ImageDraw模块也能做,只是相对复杂。如果你想在Image实例上做复杂的绘图动作,最好是自行对ImageDraw模块提供的各种方法做一些封装。

    Rectangle

    '''
    定义:draw.rectangle(box,options)
    含义:绘制一个长边形。
    变量box是包含2元组[(x,y),…]或者数字[x,y,…]的任何序列对象。它应该包括2个坐标值。
    注意:当长方形没有没有被填充时,第二个坐标对定义了一个长方形外面的点。
    变量options的fill给定长边形内部的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.rectangle([(0,0),(100,120)],fill=123)
    draw.rectangle((120,130,200,180),fill=222)
    draw.rectangle([200,200,300,400],fill=150)
    im.show()
    del draw
    

    总结:

    在图片上写字

    Draw类提供了text(position, string, options)方法,该方法可以在 Image 实例上写字。

    需要说明的是,position 指定的是文本左上角的顶点,而不是文本中心。这里可用的options有:

    • font = ImageFont instance - 指定字体,接受一个 ImageFont 的实例
    • fill = (R, G, B) - 用于指定线条的颜色,其中 R、G、B 都是 0 – 255 的整数

    Bitmap

    '''
    draw.bitmap(xy, bitmap, options)
    含义:在给定的区域里绘制变量bitmap所对应的位图,非零部分使用变量options中fill的值来填充。变量bitmap位图应该是一个有效的透明模板(模式为“1”)或者蒙版(模式为“L”或者“RGBA”)。
    这个方法与Image.paste(xy, color, bitmap)有相同的功能。
    '''

    im1 = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    im2 = Image.open('/Users/ly/Desktop/Python/py-test/image3.png')
    im = im2.resize((80,100),Image.ANTIALIAS)
    print(im.size)
    r,g,b = im.split()
    draw = ImageDraw.Draw(im1)
    draw.bitmap((0,0),r,fill=111)
    draw.bitmap((80,100),g,fill=(0,255,0))
    draw.bitmap((160,200),b,fill=(0,0,255))
    im1.show()
    del draw
    

    Pillow API 学习

    ImageFont 模块

    ImageFont模块很简单,它定义了一个同名的类。ImageFont类的实例可以传给ImageDraw中 text 方法的 font 的参数,起到字体选择的作用。

    ImageFont模块中的truetype(fontfile, fontsize)函数则可以加载TrueType或OpenType格式的字体,并返回ImageFont参数。不过 truetype 函数需要额外安装_imagingft 模块。

    Line

    '''
    定义:draw.line(xy,options)
    含义:在变量xy列表所表示的坐标之间画线。
    坐标列表可以是任何包含2元组[(x,y),…]或者数字[x,y,…]的序列对象。它至少包括两个坐标。
    变量options的fill给定线的颜色。
    (New in 1.1.5)变量options的width给定线的宽度。注意线连接不是很好,所以多段线段连接不好看。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.line([(0,0),(100,50),(50,100)],fill=123,width=3)
    draw.line([0,20,50,90,100,300,200,80],fill=222,width=10)
    im.show()
    del draw
    

    API 文档路径:

    Point

    '''
    定义:draw.point(xy,options)
    含义:在给定的坐标点上画一些点。
    坐标列表是包含2元组[(x,y),…]新葡亰496net:未读音讯,每一日贰个小程序。或者数字[x,y,…]的任何序列对象。
    变量options的fill给定点的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.point((100,100),fill=123)
    draw.point((101,101),fill=(0,0,0))
    im.show()
    del draw
    

     

    Text

    '''
    定义:draw.text(position,string, options)
    含义:在给定的位置绘制一个字符创。变量position给出了文本的左上角的位置。
    变量option的font用于指定所用字体。它应该是类ImangFont的一个实例,使用ImageFont模块的load()方法从文件中加载的。
    变量options的fill给定文本的颜色。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    draw.text((im.size[1]-100,100),'haha',fill=(255,0,0),font=ImageFont.truetype('/Users/ly/Desktop/Python/py-test/image.ttf'))
    draw.text((100,100),'lalala',font=ImageFont.truetype('Arial/Arial.ttf',46))
    im.show()
    del draw
    

    (1) PIL.Image.new(mode,size,color)

    Textsize

    '''
    定义:draw.textsize(string,options)⇒ (width, height)
    含义:返回给定字符串的大小,以像素为单位。
    变量option的font用于指定所用字体。它应该是类ImangFont的一个实例,使用ImageFont模块的load()方法从文件中加载的。
    '''

    im = Image.open('/Users/ly/Desktop/Python/py-test/image.jpg')
    draw = ImageDraw.Draw(im)
    print(draw.textsize('haha'))
    print(draw.textsize('hello word'))
    del draw
    

      mode: 新图片的模式,如RGB,灰度图相等

      size: 新图象的尺寸,元组对象(a,b)

      color: 图像的填充对象

      返回图像对象

    (2) Image.size

      获取图像尺寸,返回的是元组对象

      由于返回是元组对象,则访问结果是Image.size[0]

    (3) ImageDraw.Draw(im,mode=None)

      创建可在图片上进行绘制Draw对象

    (4) Image.paste(sourceImg,box=None,mode=None)

      将一张图片粘贴到另一张图片上

      Image对象指的是被粘贴的图片

      sourceImg: 粘贴的源图片

      box: 2元组则是粘贴图片位置的左上角开始位置

        4元组则是左上角,同时包括右下角,必须符合源图片的尺寸内

      mode:图片模式

    (5) ImageFont.trueType(font=None,size=None,index=0,filename=None)

      设置图片上字体

      filename: 设置字体文件,如若没有则是找Window字体

      size: 字体大小

    (6) ImageDraw.Draw.eclipse(xy,fill=None,outline=0)

      图片上绘制椭圆

      xy:两种方式

        [(x0,y0),(x1,y1)],[x0,y0,x1,y1]左上角,右上角坐标

      如果要画圆形则是保证两轴长度相等

      fill: 椭圆内部是否填充,填充色

      outline:椭圆轮廓宽度

     

    (7) ImageDraw.text(xy,text,fill=None,font=None)

      xy: 字的右上角的位置

      text:书写的问题,注意编码格式

      fill:文本的颜色

      font:引入字体

     

    编码经验的总结

    (1) 如果不是矢量图可能会造成叠加图片未着色遮盖,故最终选择两个图片叠加,而是直接在图片上绘制圆形

    (2) 关于图片字体仍然还需进一步的学习,因为想引入微软雅黑,结果没成功,还有就是如何加粗?

    (3)   如何让文字自适应在图片中间,C 中有获取字体的像素大小,还得再研究Pillow是否有这个函数?

    拓展

    (1) 如何抹去上面的数字标签,模拟微信已读

    (2) 如何更新上面的数字,模拟不断接受新的消息,未读

    思路:

    code改编为函数,输入参数为未读消息数据,获取原始图片的画笔

    新葡亰496net 9

     

    事件响应传入相应的参数

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net:未读音讯,每一日贰个小程序

    关键词: