gles20.glreadpixels 获取到的图片是黑的_[ImageFont] 如何利用字体生成文字图片

在OCR识别中,需要利用字体生成汉字图片。本文通过Python的Pillow库中的ImageFont模块,介绍了如何建立字体对象、获取字符信息以及如何绘制无空白的汉字图片。
摘要由CSDN通过智能技术生成

b13606dd2c346ae6850db2d15cf0ff0b.png

在OCR识别、检测的数据生成过程当中,我们经常会需要利用字体生成汉字的图片,在Python当中,这一部分的操作通常是通过Pillow 模块提供的ImageFont 模块来完成,下面我们用一个例子,介绍这个模块基本的使用方法:


1、建立一个字体对象

首先,我们需要通过ImageFont.truetype 建立一个字体对象:

# import 字体相关三件套
from PIL import ImageFont, Image, ImageDraw

# 生成font 
ttf_path = '/xxx.ttf'
text_size = 40 # text_size 是字号
font = ImageFont.truetype(ttf_path, text_size)

通过这个这个对象,我们可以获取一个字体当中存储的每个字符的相关信息:

2、通过font 获取字符相关信息

2.1 基本的区域信息

font 对象一般来说比较常用的两个方法为:

381656af42b241e6ed8a750340769811.png

这两对数字是什么意思呢?

我们以下面这张图当中的’一’ 为例,我们知道,将一个‘一’画在屏幕上基本需要知道两个信息:

1、要用多大的一个“格子”来画‘一’,这就对应着上述的getsize,需要一个宽300,高256的画布才能画出这个 ‘一’
2、我们知道,汉字一般会在书写的时候,上下留出一些空间,所以如下图,如果黑框内为汉字实际的内容,则我们需要以左上角为起点,x轴偏移0个单位,y轴偏移117个单位才能画出这个'一',这就对应着 font.getoffset('一')

dc81fe3e8ab901ac2c5c6d7300b536e0.png

2.2 获取更加详细的信息

在2.1 中,我们已经获取了字体的一般信息,但是事实上ImageFont 还提供给了我们更加详细的信息供我们使用:

b29c969a8ce38973106c6e5a3ce7f4a7.png

3、绘制图片

有了上述的了解,我们就可以绘制图片了:

绘制一般使用ImageDraw 这个类,一般的绘制是没有问题的:

2309ef08cca0b44760456db1113ec5bb.png

但如果希望能够绘制一个完全包络汉字,不留周围空白的图片,就会稍微复杂一些:

2e6277caf631947e00dea5aaa8396d95.png
解释一下 GLES20.glClearColor(0.0f, 0.0f, 0.0f, Vuforia.requiresAlpha() ? 0.0f : 1.0f); for (Texture t : mTextures) { GLES20.glGenTextures(1, t.mTextureID, 0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, t.mTextureID[0]); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, t.mWidth, t.mHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, t.mData); } shaderProgramID = SampleUtils.createProgramFromShaderSrc( CubeShaders.CUBE_MESH_VERTEX_SHADER, CubeShaders.CUBE_MESH_FRAGMENT_SHADER); vertexHandle = GLES20.glGetAttribLocation(shaderProgramID, "vertexPosition"); // textureCoordHandle = GLES20.glGetAttribLocation(shaderProgramID, // "vertexTexCoord"); mVColorCenterHandler = GLES20.glGetUniformLocation(shaderProgramID, "vColorCenter"); mvpMatrixHandle = GLES20.glGetUniformLocation(shaderProgramID, "modelViewProjectionMatrix"); texSampler2DHandle = GLES20.glGetUniformLocation(shaderProgramID, "texSampler2D"); if(!mModelIsLoaded) { mTeapot = new Teapot(); mxyz1 = new xyz1(); try { mBuildingsModel = new SampleApplication3DModel(); mBuildingsModel.loadModel(mActivityRef.get().getResources().getAssets(), "ImageTargets/Buildings.txt"); mModelIsLoaded = true; } catch (IOException e) { Log.e(LOGTAG, "Unable to load buildings"); } // Hide the Loading Dialog mActivityRef.get().loadingDialogHandler .sendEmptyMessage(LoadingDialogHandler.HIDE_LOADING_DIALOG); } }
最新发布
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值