Python PIL创建文字图片
PIL库中包含了很多模块,恰当地利用这些模块可以做许多图像处理方面的工作。
下面是我用来生成字母或字符串测试图片而写的类及测试代码。
主要用到的模块:
PIL.Image,PIL.ImageDraw,PIL.ImageFont
PIL.Image用来生成一个空的图片,ImageDraw用来在空图片上画图及写字符,ImageFont则是创建需要使用到的字体
主要用到的代码:
#创建一个空的图片
self.img = Image.new(self.imgMode, self.imgSize, self.bg_color) self.drawBrush = ImageDraw.Draw(self.img)#创建画刷,用来写文字到图片img上 #创建字体,fontFile为字体文件,若非系统字体需加详细路径
self.font = ImageFont.truetype(fontFile,fontsize)
#使用特定字体写字,(textX0,textY0)为文字开始的左上角起始位置 self.drawBrush.text((textX0,textY0), self.letters, fill=self.fg_color,font=self.font)
详细代码:
#-*- 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创建文字图片的更多相关文章
- 基于Python PIL实现简单图片格式转化器
基于Python PIL实现简单图片格式转化器 目录 基于Python PIL实现简单图片格式转化器 1.简介 2.前期资料准备 2.1.1如何实现图片格式转换? 2.1.2如何保存需要大小的图片? ...
- Python,PIL压缩裁剪图片
自己写了用来压缩 DC 照片的,批量处理整目录文件,非常方便.需要安装 PIL #!/usr/bin/env python import Image import os import os.path ...
- Python PIL模块笔记
利用python pil 实现给图片上添加文字 图片中添加文字#-*- coding: utf-8 -*- from PIL import Image,ImageDraw,ImageFont ttfo ...
- java生成竖排文字图片
package com.kadang.designer.web.action;import java.awt.Color;import java.awt.Font;import java.awt.Fo ...
- 基于PIL模块创建验证码图片
def get_valid_img(request): # 方式2:基于PIL模块创建验证码图片 from PIL import Image, ImageDraw, ImageFont from io ...
- Python批量创建word文档(2)- 加图片和表格
Python创建word文档,任务要求:小杨在一家公司上班,每天都需要给不同的客户发送word文档,以告知客户每日黄金价格.要求在文档开始处给出banner条,价格日期等用表格表示.最后贴上自己的联系 ...
- python PIL 图像处理操作
python PIL 图像处理 # 导入Image库 import Image # 读取图片 im = Image.open("1234.jpg") # 显示图片 im.show( ...
- Python简单的制作图片验证码
-人人可以学Python--这里示范的验证码都是简单的,你也可以把字符扭曲 人人可以学Python.png Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使 ...
- python PIL 图像处理
python PIL 图像处理 This blog is from: https://www.jianshu.com/p/e8d058767dfa Image读出来的是PIL的类型,而skimage. ...
随机推荐
- Codeforces Round #346 (Div. 2) F. Polycarp and Hay 并查集
题目链接: 题目 F. Polycarp and Hay time limit per test: 4 seconds memory limit per test: 512 megabytes inp ...
- 电商安全无小事,如何有效地抵御 CSRF 攻击?
现在,我们绝大多数人都会在网上购物买东西.但是很多人都不清楚的是,很多电商网站会存在安全漏洞.比如乌云就通报过,国内很多家公司的网站都存在 CSRF 漏洞.如果某个网站存在这种安全漏洞的话,那么我们在 ...
- express 3.0.x 中默认不支持flash() 的解决方法
Express 3.x默认已经不支持req.flash(),如果要用flash()需要这样兼容 1.flash 消息暂存在session中,需要cookieParser 和 session中间件来声明 ...
- Linq基本用法
- struts2 标签的使用之一 s:if
struts2 的web 项目中为了方便的编写jsp,标签是最好的选择 1:struts2 标签库的定义在**-core-版本号.jar META-INF 路径下找到struts-tags.tld文件 ...
- CodeForces 300A Array
http://codeforces.com/problemset/problem/300/A 题意 :给你n个数字,让你分成3组,第一组各个数之积要小于0,第二组要大于0,第三组要等于0,符合要求的答 ...
- Zookeeper + Hadoop + Hbase部署备忘
网上类似的文章很多,本文只是记录下来备忘.本文分四大步骤: 准备工作.安装zookeeper.安装hadoop.安装hbase,下面分别详细介绍: 一 准备工作 1. 下载 zookeeper.had ...
- Java知识大全
http://blog.csdn.net/zhangerqing/article/details/8245560
- 转:C语言宏定义时#(井号)和##(双井号)的用法
转自:http://www.cnblogs.com/welkinwalker/archive/2012/03/30/2424844.html#2678295 #在英语里面叫做 pound 在C语言的宏 ...
- 睡眠--TASK_INTERRUPTIBLE and TASK_UNINTERRUPTIBLE
http://i.cnblogs.com/EditPosts.aspx?opt=1 Two states are associated with sleeping, TASK_INTERRUPTI ...