Python PIL创建文字图片

PIL库中包含了很多模块,恰当地利用这些模块可以做许多图像处理方面的工作。

下面是我用来生成字母或字符串测试图片而写的类及测试代码。

主要用到的模块:

PIL.Image,PIL.ImageDraw,PIL.ImageFont

PIL.Image用来生成一个空的图片,ImageDraw用来在空图片上画图及写字符,ImageFont则是创建需要使用到的字体

#-*- coding:gb2312 -*-
from PIL import Image,ImageDraw,ImageFont,ImageOps
import numpy as np
import random

class LetterImage():

    def __init__(self,fontFile=‘‘,imgSize=(0,0),imgMode=‘RGB‘,bg_color=(0,0,0),fg_color=(255,255,255),fontsize=20):
        self.imgSize = imgSize
        self.imgMode = imgMode
        self.fontsize = fontsize
        self.bg_color = bg_color
        self.fg_color = fg_color
#         self.font = ImageFont.load(‘车牌字体.ttf‘)
        if ‘‘==fontFile:
            self.font = ImageFont.truetype(‘DIN1451.ttf‘, fontsize)
        else:
            self.font = ImageFont.truetype(fontFile,fontsize)

    def GenLetterImage(self,letters):
        ‘‘‘Generate the Image of letters‘‘‘
        self.letters = letters
        (self.letterWidth,self.letterHeight) = self.font.getsize(letters)
        if self.imgSize==(0,0):
            self.imgSize=(self.letterWidth+2,self.letterHeight+2)
        self.imgWidth,self.imgHeight=self.imgSize
        self.img = Image.new(self.imgMode, self.imgSize, self.bg_color)
        self.drawBrush = ImageDraw.Draw(self.img)
        textY0 = (self.imgHeight-self.letterHeight+1)/2
        textY0 = int(textY0)
        textX0 = int((self.imgWidth-self.letterWidth+1)/2)
        print ‘text location:‘,(textX0,textY0)
        print ‘text size (width,height):‘,self.letterWidth,self.letterHeight
        print ‘img size(width,height):‘,self.imgSize
#         if textX0<0 or textY0<0:
#             raise Exception(‘size error text location x0:%d,y0:%d‘%(textX0,textY0))
        self.drawBrush.text((textX0,textY0), self.letters, fill=self.fg_color,font=self.font)

    def SaveImg(self,saveName=‘‘):
        if ‘‘==saveName.strip():
            saveName = str(self.letters.encode(‘gb2312‘))+‘.png‘
        fileName,file_format = saveName.split(‘.‘)
        fileName+=‘_‘+str(self.fontsize)+‘.‘+file_format
        print fileName,file_format
        self.img.save(fileName, file_format)

    def Show(self):
        self.img.show()

def clearpictures():
    import os
    png = os.listdir(os.curdir)
    for i in png:
        if os.path.splitext(i)[1]==".png":
            os.remove(i)

if __name__==‘__main__‘:
    letterList = []
    letterList.append(LetterImage(bg_color=(0,0,255),fontsize=10))
    letterList.append(LetterImage(fontFile=‘‘,bg_color=(0,0,255),fontsize=400))
    letter=[u‘u‘,u‘v‘]
    num_letter = 2

    svd_u=[]
    svd_s=[]
    svd_v=[]
    import cv2
    mergeImg = np.zeros((470,444))
    npareiImg =[]
    for i in range(num_letter):
        letterList[i].GenLetterImage(letter[i])
#         letterList[i].Show()
#         letterList[i].SaveImg()
        grayImg = ImageOps.grayscale(letterList[i].img)
        grayImg = grayImg.resize((222,470),resample=Image.BICUBIC)
        npareiImg.append( np.asarray(grayImg))
        cv2.namedWindow(‘%s‘%i)
        cv2.imshow(‘%s‘%i, npareiImg[i])
        mergeImg[0:470,i*222:(i+1)*222]=npareiImg[i]
        u,s,v=np.linalg.svd(npareiImg[i])
        print ‘u and img \‘s shape‘,u.shape,npareiImg[i].shape
        svd_u.append(u)
        svd_v.append(v)
        svd_s.append(s)

#     mergeImgNp=Image.fromarray(mergeImg)#, mode)
#     mergeImgNp.show()
    uDifNorm=np.linalg.norm(svd_u[0]-svd_u[1])
    print uDifNorm
    vDifNorm = np.linalg.norm(svd_v[0]-svd_v[1])
    print vDifNorm
    sDifNorm = np.linalg.norm(svd_s[0]-svd_s[1])
    print sDifNorm
    ou_norm = np.linalg.norm(np.asarray(npareiImg[0])-np.asarray(npareiImg[1]))
    print ou_norm
    f=open(‘record.txt‘,‘a‘)
    lines=[]
    lines.append(‘letters: %s,%s‘%(letter[0],letter[1]))
    lines.append(‘SVD u diff norm:\t%f‘%uDifNorm)
    lines.append(‘SVD v diff norm:\t%f‘%vDifNorm)
    lines.append(‘SVD s diff norm:\t%f‘%sDifNorm)
    lines.append(‘Ou norm:        \t%f‘%ou_norm)
    str_to_write=‘\n‘.join(lines)+‘\n‘
    print str_to_write
    f.write(str_to_write)
    f.close()
    cv2.waitKey()

上面的测试后部分是对图像做SVD变换的一点实验。

显示的结果(图像已经被resize到统一大小,代码中的字符图像类生成的图像其实会根据字体大小自动设定)

当然,生成这种测试图像也不一定就非得用PIL或者python,matlab中应该也可以,其实也就是先生成一个空的图像矩阵,然后调用写字符的函数在这个空图像上以特定的字体写上字符串罢了。

使用汉字字体时要注意的问题:

一般的做法是在文件开头的位置加上#-*- coding:gb2312 -*- 指定使用中文编码。这样一般不会有错。但有时可能我们需要对部分字符串转换编码,这时我们可利用字符对象的encode、decode方法。encode是对当前字符使用指定的编码方案重新编码。decode是使用指定的编码方案进行解码。两者都是码制的转换,但使用时往往容易弄错。encode其实是对本身为unicode的字符使用指定的字符进行编码,而decode则是使用指定编码将字符解码为unicode编码。所有在使用encode时,如果本身不是unicode码就会出错,在使用decode时,如果不知道本身所使用的编码方案也会出错.

Python PIL创建文字图片

时间: 2024-10-06 11:55:33

Python PIL创建文字图片的相关文章

python,让文字变成图片

小白:让文字变成图片?很简单啊,先在微信上打几个字,再截图,就是图片啦! 西门吹雪:但是这种方式,你不能预先设置字体的属性,以及图片的背景颜色等. 本文介绍一种简单的办法,让输入的文字显示到一张图片中,并且可以对字体与颜色进行设置. 为了简便地实现,这里使用python来处理,并且结合mac系统上的alfred来使用. 小白:alfred? 西门吹雪:mac系统上的神奇武器,你值得拥有! 小白:倚天剑? 先演示一下,使用的效果: 有两个程序要写. 一个是创建图片,设置图片的背景颜色与字体的颜色,

RGB值转化图片(python PIL)

今天看到一道misc的题目,得到一RGB值的txt文件,需解决RGB值转图片.具体题目:here 由于第一次碰到这个类型的题目,做一下记录,在这里我采用的是python 的PIL图像库 具体思路: 1.首先我们要先确定图片的size,既宽度高度 通过txt文件行数(61366=2*61*503,因为最后一行是空行,所以不在计算范围内)的整数分解 可以得到以下几个不同的size:503*122,1006*61,30683*2(x,y交换一下对图片不会有很大的变化,只是横着和竖着的区别) 所以我们接

python PIL Image基本的图片拼接、圆形裁减、添加文字

使用Image包合成图片 添加文字. 下面将通过实例介绍利用py PIL包对图片进行合成,裁减以及添加文字. 原始图片4张 合成后图片: 图片处理 图片拼接 # 创建空白图片 target = Image.new('RGBA', (width, hight+504), (255, 255, 255)) # 创建header Image对象,paste拼接到空白图片指定位置target.paste(img_h, (0, 0)) img_h = img_header(os.path.join(tas

图片切碎片脚本 python PIL库实践

python PIL库实践运用,对图像进行切碎片操作. 原图如图一 图一 我们想要的是图片的不同部分,比如图二中1.2.3.4每一个分区单独的碎片, 图二 做法是做出4张跟原图大小一样的碎片模版图,白底,想要的区域涂黑(非纯白)即可.1区域的碎片模板图如图三所示: 图三 脚本处理图片的方法:先找出碎片模版中的非白区域(可以不规则),然后将原图中这个区域内的所有像素点的颜色都放到新的一张跟原图像素大小一样的新图上,新图的其余位置都设置成透明(可以根据自己的不同需求进行不同的调整). 1碎片模版得到

Python简单的制作图片验证码

-人人可以学Python--这里示范的验证码都是简单的,你也可以把字符扭曲 人人可以学Python.png Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使用它来生成图片验证码PIL安装命令安装: pip install pillow 下载源码安装:复制地址 :https://github.com/python-pillow/Pillow PIL使用 例子:生成图片,并填充文字 #!/usr/bin/python #-*-coding:utf-8-*-

python PIL库回顾

之前用PIL的时候都不知道看官方文档,网上搜索结果靠前的一些介绍性的博客其实很扯淡,讲两个函数.贴三张图,文章就完了. 今天把他的文档看了看,发现一点也不简单,网上介绍的不过是冰山一角. 对于我这样一个不太懂多媒体的人,如果用到图像处理,主要也就这些操作: 读写.取通道.两幅图合并.像素点操作.各种滤镜.色彩模式转换.图像旋转.缩放.裁剪.仿射. PIL对付这些小喽啰,都是完全没有问题的. 读写 open是Image类的一个方法,返回值是一个Image对象,值得注意的是,open不能打开网络图片

python PIL库回顾1

1 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HE

Python 实现识别弱图片验证码

目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫.验证码的形式有多种,最常见的就是图片验证码.其他验证码的形式有音频验证码,滑动验证码等.图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错.本文主要讲解识别弱图片验证码. 1 图片验证码强度 图片验证码主要采用加干扰线.字符粘连.字符扭曲方式来增强识别难度. 加干扰线 加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色. 字符粘连 各个字符之间的间隔比较小,互相依靠,能以分割.

爬虫学习 08.Python网络爬虫之图片懒加载技术、selenium和PhantomJS

爬虫学习 08.Python网络爬虫之图片懒加载技术.selenium和PhantomJS 引入 今日概要 图片懒加载 selenium phantomJs 谷歌无头浏览器 知识点回顾 验证码处理流程 今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests from lxml import