python实现文字转图片(代码片段)

南淮北安 南淮北安     2023-03-18     641

关键词:

文章目录

一、需求

目前想要将输入的文字,转为指定风格的图片,比如宋体、草体

二、实现文字转单个图片代码

import os
import pdb

import PIL
import numpy as np
from PIL import Image, ImageFont
from PIL import ImageDraw

import scipy.misc as misc


CANVAS_SIZE = 256
# CANVAS_SIZE = 224
# CHAR_SIZE = 200
CHAR_SIZE = 220
EMBEDDING_DIM = 128
X_OFFSET = 20
Y_OFFSET = 20

def _draw_single_char(font, ch, width, height):
    img = Image.new("RGB", (width, height), (255,255,255))
    draw = ImageDraw.Draw(img)
    draw.text((0, 0), ch, fill=0, font=font)
# 这里的设置是为了和原始的训练集参数设置一致
    # draw.text((X_OFFSET, Y_OFFSET), ch, fill=0, font=font)
    return img


def get_textsize(font, ch):
    img = Image.new("RGB", (1, 1), (255, 255, 255))
    draw = ImageDraw.Draw(img)
    char_size = draw.textsize(ch, font=font)
    return char_size


def draw_single_char(img, canvas_size, char_size):
    width, height = img.size
    factor = width * 1.0 / char_size

    max_height = canvas_size * 2
    if height / factor > max_height:  # too long
        img = img.crop((0, 0, width, int(max_height * factor)))
    if height / factor > char_size + 5:  # CANVAS_SIZE/CHAR_SIZE is a benchmark, height should be less
        factor = height * 1.0 / char_size

    img = img.resize((int(width / factor), int(height / factor)), resample=PIL.Image.LANCZOS)

    bg_img = Image.new("RGB", (canvas_size, canvas_size), (255, 255, 255))
    offset = ((canvas_size - img.size[0]) // 2, (canvas_size - img.size[1]) // 2)
    bg_img.paste(img, offset)
    return bg_img


def draw_single_char_by_font(ch, font, canvas_size, char_size):
    width, height = get_textsize(font, ch)
    char_img = _draw_single_char(font, ch, width, height)

    return draw_single_char(char_img, canvas_size, char_size)




def save_imgs(imgs, count, save_dir):
    # 这里的0是label标签
    p = os.path.join(save_dir, "0_%03d.jpg" % count)
    imgs.save(p)


def draw_paired_image(src_img, dst_img, canvas_size):
    assert src_img.size == (canvas_size, canvas_size)
    assert dst_img.size == (canvas_size, canvas_size)

    example_img = Image.new("RGB", (canvas_size * 2, canvas_size), (255, 255, 255))
    example_img.paste(dst_img, (0, 0))
    example_img.paste(src_img, (canvas_size, 0))
    return example_img


def draw_example(ch, src_font, dst_font, canvas_size, filter_hashes, char_size):
    src_img = draw_single_char_by_font(ch, src_font, canvas_size, char_size)
    dst_img = draw_single_char_by_font(ch, dst_font, canvas_size, char_size)

    # check the filter example in the hashes or not
    dst_hash = hash(dst_img.tobytes())
    if dst_hash in filter_hashes or np.min(src_img) == 255 or np.min(dst_img) == 255:
        return None

    return draw_paired_image(src_img, dst_img, canvas_size)


def draw_example_src_only(ch, src_font, dst_img, canvas_size, char_size):
    src_img = draw_single_char_by_font(ch, src_font, canvas_size, char_size)

    assert dst_img.size == (canvas_size, canvas_size), pdb.set_trace()

    if np.min(src_img) == 255 or np.min(dst_img) == 255:
        return None

    example_img = Image.new("RGB", (canvas_size * 2, canvas_size), (255, 255, 255))
    example_img.paste(dst_img, (0, 0))
    example_img.paste(src_img, (canvas_size, 0))
    return example_img


if __name__ == '__main__':
    dst_font = "fonts/font/caoti.ttf"
    save_dir = "test/"

    test = "我想要图片"
    print(os.path.isfile(dst_font))
    dst_font = ImageFont.truetype(dst_font, size=CHAR_SIZE)
    count=0
    for ch in list(test):
        dst_img = draw_single_char_by_font(ch, dst_font, CANVAS_SIZE, CHAR_SIZE)
        save_imgs(dst_img,count,save_dir)
        count = count+1

三、实现文字转配对图片代码

字体顺序可以根据自己的需求进行调

import os
import pdb

import PIL
import numpy as np
from PIL import Image, ImageFont
from PIL import ImageDraw

import scipy.misc as misc


CANVAS_SIZE = 256
# CANVAS_SIZE = 224
# CHAR_SIZE = 200
CHAR_SIZE = 220
EMBEDDING_DIM = 128
X_OFFSET = 20
Y_OFFSET = 20

def _draw_single_char(font, ch, width, height):
    img = Image.new("RGB", (width, height), (255,255,255))
    draw = ImageDraw.Draw(img)
    draw.text((0, 0), ch, fill=0, font=font)
	# 这里的设置是为了和原始的训练集参数设置一致
    # draw.text((X_OFFSET, Y_OFFSET), ch, fill=0, font=font)
    return img


def get_textsize(font, ch):
    img = Image.new("RGB", (1, 1), (255, 255, 255))
    draw = ImageDraw.Draw(img)
    char_size = draw.textsize(ch, font=font)
    return char_size


def draw_single_char(img, canvas_size, char_size):
    width, height = img.size
    factor = width * 1.0 / char_size

    max_height = canvas_size * 2
    if height / factor > max_height:  # too long
        img = img.crop((0, 0, width, int(max_height * factor)))
    if height / factor > char_size + 5:  # CANVAS_SIZE/CHAR_SIZE is a benchmark, height should be less
        factor = height * 1.0 / char_size

    img = img.resize((int(width / factor), int(height / factor)), resample=PIL.Image.LANCZOS)

    bg_img = Image.new("RGB", (canvas_size, canvas_size), (255, 255, 255))
    offset = ((canvas_size - img.size[0]) // 2, (canvas_size - img.size[1]) // 2)
    bg_img.paste(img, offset)
    return bg_img


def draw_single_char_by_font(ch, font, canvas_size, char_size):
    width, height = get_textsize(font, ch)
    char_img = _draw_single_char(font, ch, width, height)

    return draw_single_char(char_img, canvas_size, char_size)




def save_imgs(imgs, count, save_dir):
    # 这里的0是label标签
    p = os.path.join(save_dir, "0_%03d.jpg" % count)
    imgs.save(p)


def draw_paired_image(src_img, dst_img, canvas_size):
    assert src_img.size == (canvas_size, canvas_size)
    assert dst_img.size == (canvas_size, canvas_size)

    example_img = Image.new("RGB", (canvas_size * 2, canvas_size), (255, 255, 255))
    example_img.paste(dst_img, (0, 0))
    example_img.paste(src_img, (canvas_size, 0))
    return example_img


def draw_example(ch, src_font, dst_font, canvas_size, filter_hashes, char_size):
    src_img = draw_single_char_by_font(ch, src_font, canvas_size, char_size)
    dst_img = draw_single_char_by_font(ch, dst_font, canvas_size, char_size)

    # check the filter example in the hashes or not
    dst_hash = hash(dst_img.tobytes())
    if dst_hash in filter_hashes or np.min(src_img) == 255 or np.min(dst_img) == 255:
        return None

    return draw_paired_image(src_img, dst_img, canvas_size)


def draw_example_src_only(ch, src_font, dst_img, canvas_size, char_size):
    src_img = draw_single_char_by_font(ch, src_font, canvas_size, char_size)

    assert dst_img.size == (canvas_size, canvas_size), pdb.set_trace()

    if np.min(src_img) == 255 or np.min(dst_img) == 255:
        return None

    example_img = Image.new("RGB", (canvas_size * 2, canvas_size), (255, 255, 255))
    example_img.paste(dst_img, (0, 0))
    example_img.paste(src_img, (canvas_size, 0))
    return example_img


if __name__ == '__main__':
    dst_font = "fonts/font/caoti.ttf"
    src_font = "fonts/font/songti.ttf"
    save_dir = "test/"
    test = "我想要图片"

    src_font = ImageFont.truetype(src_font, size=CHAR_SIZE)
    dst_font = ImageFont.truetype(dst_font, size=CHAR_SIZE)
    count=0
    for ch in list(test):
        dst_img = draw_single_char_by_font(ch, dst_font, CANVAS_SIZE, CHAR_SIZE)
        example_img1 = draw_example_src_only(ch,src_font,dst_img,CANVAS_SIZE,CHAR_SIZE)
        save_imgs(example_img1,count,save_dir)
        count = count+1

python实现图片转字符画(代码片段)

fromPILimportImageimportargparse#构建命令行输入参数处理ArgumentParser实例parser=argparse.ArgumentParser()#定义输入文件,输出文件,输出字符画的宽和高parser.add_argument(\'file\')#输入文件parser.add_argument(\'-o\',\'--output\')#输出文件parser. 查看详情

1行python代码,实现pdf转图片,速度太太太太太快了(代码片段)

大家好,这里是Python程序员晚枫。今天python-office继续发布新功能:1行代码,实现PDF转图片。速度真的很快!我还以为程序坏掉了,结果是早就运行完了。1.安装python-office安装很简单,在有python环境的电脑上,只需要执行下面这... 查看详情

python使用websocket调用语音识别,语音转文字(代码片段)

@目录0.太长不看系列,直接使用1.Python调用标贝科技语音识别websocket接口,实现语音转文字1.1环境准备:1.2获取权限1.2.1登录1.2.2创建新应用1.2.3选择服务1.2.4获取Key&Secret2.代码实现2.1获取access_token2.2准备数据2.3配置接口参数2.4... 查看详情

python+opencv实现文字分割(横板-小票文字分割/竖版-古文文字分割)(代码片段)

图片文字分割的时候,常用的方法有两种。一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像;还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像。投影法对文字图片作横向和纵向投... 查看详情

.net6图片转文字picturetotxt(代码片段)

一、创建工程创建工程后,打开Nuget输入Spire.OCR,进行安装二、代码编写usingSpire.OCR;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usin 查看详情

.net6图片转文字picturetotxt(代码片段)

一、创建工程创建工程后,打开Nuget输入Spire.OCR,进行安装二、代码编写usingSpire.OCR;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usin 查看详情

小聪明图片消失在另一张图片里(代码片段)

...,现在还没有想通,做此记录,以后有机会再慢慢改进:python包matplotlib保存数组构成的图片时,会自动加个透明层,即不是我想要的RGB格式,而是RGBA格式。why,why 查看详情

python3实现yuv(黑白图像转rgb图像)转jpg图片方法浅谈(代码片段)

最近工作需要需要把YUV的图像转换成rgb的彩色图方便查看。查阅了很多资料基本上都是说的不太清晰,导致像我这样的小白无法准确的定位代码的正确性,只能试来试去的比较浪费时间。说的如果有不对地方的话请私信... 查看详情

canvas转图片中的文字自动换行(代码片段)

概述最近项目用到了canvas转图片,但是由于canvas对文字排版的支持非常弱,一般我们在canvas上画不同排版的文字(比如竖排文字)都是利用js计算横纵坐标,然后一个字一个字地画出来,今天无意中看到一个使用svg的方法,记录... 查看详情

怎样做才能实现图片转文字

...效果”;第五步:点击右下角的“一键识别”按钮,开始实现图片转文字;第六步:想快速的查看识别成功的图片文字,点击操作下面的“打开文件”按钮,便可以直接打开文档了。以上便是图片转文字的全部方法了,希望可以... 查看详情

基于easyocr+hanlp实现图片文字实体(中文姓名机构名地域名)识别(代码片段)

一、EasyOCR+HanLpEasyOCR是一个python版的文字识别工具。目前支持80中语言的识别。并且支持:图像预处理(去噪、色彩饱和度、尖锐处理)、CRAFT文字检测、中间处理(倾斜处理等)、文字识别、后续处理、输出结... 查看详情

基于easyocr+hanlp实现图片文字实体(中文姓名机构名地域名)识别(代码片段)

一、EasyOCR+HanLpEasyOCR是一个python版的文字识别工具。目前支持80中语言的识别。并且支持:图像预处理(去噪、色彩饱和度、尖锐处理)、CRAFT文字检测、中间处理(倾斜处理等)、文字识别、后续处理、输出结... 查看详情

快速实现图片转文字的方法

在日常的生活和办公中,哪一种方法可以快速实现图片转文字呢,实现图片转文字的快速方法,可以尝试借助一种名叫OCR文字识别的工具,可以帮助我们快速的将图片转换成文字,下面小编就分享一个使用工具实现图片转文字的... 查看详情

如何快速实现图片文字转word

...,但是这样做进度太慢,工作中根本就没有那么多时间去实现,这个时候就可以利用图片转文字软件来帮助解决问题了,可以快速实现图片文字转Word,以下是具体的操作方法。  操作步骤:  步骤一:先在电脑中准备好一... 查看详情

android实现tts文字转语音功能(代码片段)

本文地址:https://blog.csdn.net/qq_40785165/article/details/122746461,转载需附上此链接简单是稳定的前提。大家好,我是小黑,一个还没秃头的程序员~~~这次给大家介绍一个Android自带的功能——TTS文字转语音,即将输... 查看详情

textview文字描边实现(代码片段)

TextView文字描边实现需求描述文字显示在图片的上面,图片的内容是不确定了,为了防止文字与图片的颜色相近导致用户看不到或者看不清文字的问题,所以显示文字描边,避免问题。实现实现思想使用TextPaint绘制相同文字在Text... 查看详情

基于tesseract模块python实现提取图片中的文字信息(安装+使用教程)(代码片段)

Python实现提取图片中的文字可以使用OpticalCharacterRecognition(OCR)技术来解决。OCR是指将图像中的文本转换成可编辑的文本的过程。Python有许多OCR库,但最流行和最广泛使用的是Tesseract库。下面是一个使用Python和Tesseract来提取图... 查看详情

python批量添加图片水印(代码片段)

一、前言现在盗图是非常常见的事情,许多人在使用图片时都不会标注图片的出处或者提及作者,这个时候水印就是个很好的东西了。我们可以给图片添加水印后再分享出去,这样就可以让其它人知道图片作者相关的... 查看详情