这篇文章主要介绍了python3.6环境下如何安装freetype库和基本使用方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。在做图像展示的时候,可以写入中文文字,效果还是很好。

在之前安装库时基本都是直接切换到python3.6环境下直接pip install XXX,在安装freetype直接pip install freetype 不可以了,查了半天又是编译又是官网下载的,太麻烦,不推荐。
(1)正确的安装方法: 注意:一定要加上 -py
1 |
pip install freetype - py |
(2)常用调用方法
已经封装好了一个文件,可直接保存后调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
import freetype
import copy
class put_chinese_text( object ):
def __init__( self , ttf):
self ._face = freetype.Face(ttf)
def draw_text( self , image, pos, text, text_size, text_color):
'''
draw chinese(or not) text with ttf
:param image: image(numpy.ndarray) to draw text
:param pos: where to draw text
:param text: the context, for chinese should be unicode type
:param text_size: text size
:param text_color:text color
:return: image
'''
self ._face.set_char_size(text_size * 64 )
metrics = self ._face.size
ascender = metrics.ascender / 64.0
# descender = metrics.descender/64.0
# height = metrics.height/64.0
# linegap = height - ascender + descender
ypos = int (ascender)
text = text
img = self .draw_string(image, pos[ 0 ], pos[ 1 ] + ypos, text, text_color)
return img
def draw_string( self , img, x_pos, y_pos, text, color):
'''
draw string
:param x_pos: text x-postion on img
:param y_pos: text y-postion on img
:param text: text (unicode)
:param color: text color
:return: image
'''
prev_char = 0
pen = freetype.Vector()
pen.x = x_pos << 6 # div 64
pen.y = y_pos << 6
hscale = 1.0
matrix = freetype.Matrix( int (hscale) * 0x10000 , int ( 0.2 * 0x10000 ), \
int ( 0.0 * 0x10000 ), int ( 1.1 * 0x10000 ))
cur_pen = freetype.Vector()
pen_translate = freetype.Vector()
image = copy.deepcopy(img)
for cur_char in text:
self ._face.set_transform(matrix, pen_translate)
self ._face.load_char(cur_char)
kerning = self ._face.get_kerning(prev_char, cur_char)
pen.x + = kerning.x
slot = self ._face.glyph
bitmap = slot.bitmap
cur_pen.x = pen.x
cur_pen.y = pen.y - slot.bitmap_top * 64
self .draw_ft_bitmap(image, bitmap, cur_pen, color)
pen.x + = slot.advance.x
prev_char = cur_char
return image
def draw_ft_bitmap( self , img, bitmap, pen, color):
'''
draw each char
:param bitmap: bitmap
:param pen: pen
:param color: pen color e.g.(0,0,255) - red
:return: image
'''
x_pos = pen.x >> 6
y_pos = pen.y >> 6
cols = bitmap.width
rows = bitmap.rows
glyph_pixels = bitmap. buffer
for row in range (rows):
for col in range (cols):
if glyph_pixels[row * cols + col] ! = 0 :
try :
img[y_pos + row][x_pos + col][ 0 ] = color[ 0 ]
img[y_pos + row][x_pos + col][ 1 ] = color[ 1 ]
img[y_pos + row][x_pos + col][ 2 ] = color[ 2 ]
except :
continue
if __name__ = = '__main__' :
# just for test
import cv2
line = '毛不易'
img = cv2.imread( './aa.jpg' )
color_ = ( 0 , 255 , 0 ) # Green
pos = ( 3 , 3 )
text_size = 24
ft = put_chinese_text( 'yahei.ttf' )
image = ft.draw_text(img, pos, line, text_size, color_)
cv2.imshow( 'ss' , image)
cv2.waitKey( 0 ) |
总结
到此这篇关于python3.6环境下安装freetype库和基本使用方法(推荐)的文章就介绍到这了 |