首页 > 其他分享 >字体图片批量生成-字体识别模型数据

字体图片批量生成-字体识别模型数据

时间:2024-12-09 23:53:34浏览次数:10  
标签:dirs 识别 批量 text 字体 path line font os

众所周知,我们的文字有各种字体,字体通过字体文件方式供操作系统使用,在需要使用字体图片的场景,我们如何快速生成呢?

这篇文章介绍下,如何通过操作系统自带的字体文件,利用python的pillow包快速生成字体图片。

  1. 各操作系统字体文件路径
    windows\linux\macos:
dirs = []
if sys.platform == "win32":
    # check the windows font repository
    # NOTE: must use uppercase WINDIR, to work around bugs in
    # 1.5.2's os.environ.get()
    windir = os.environ.get("WINDIR")
    if windir:
        dirs.append(os.path.join(windir, "fonts"))
elif sys.platform in ("linux", "linux2"):
    data_home = os.environ.get("XDG_DATA_HOME")
    if not data_home:
        # The freedesktop spec defines the following default directory for
        # when XDG_DATA_HOME is unset or empty. This user-level directory
        # takes precedence over system-level directories.
        data_home = os.path.expanduser("~/.local/share")
    xdg_dirs = [data_home]

    data_dirs = os.environ.get("XDG_DATA_DIRS")
    if not data_dirs:
        # Similarly, defaults are defined for the system-level directories
        data_dirs = "/usr/local/share:/usr/share"
    xdg_dirs += data_dirs.split(":")

    dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs]
elif sys.platform == "darwin":
    dirs += [
        "/Library/Fonts",
        "/System/Library/Fonts",
        os.path.expanduser("~/Library/Fonts"),
    ]
  1. pillow生成图片

import os
import random

import nltk
from PIL import Image, ImageDraw, ImageFont

# Download the necessary data from nltk
nltk.download('inaugural')

def wrap_text(text, line_length=4):
    """Wraps the provided text every 'line_length' words."""
    words = text.split()
    return "\n".join([" ".join(words[i:i + line_length]) for i in range(0, len(words), line_length)])


def random_prose_text(line_length=4):
    """Returns a random snippet from the Gutenberg corpus."""
    corpus = nltk.corpus.inaugural.raw()
    start = random.randint(0, len(corpus) - 800)
    end = start + 800
    return wrap_text(corpus[start:end], line_length=line_length)


def gen_images():
    # get font name and font files
    font_files = []
    for font_dir in dirs:
        for font_file in os.listdir(font_dir):
            if font_file.endswith('.ttf') or font_file.endswith('.ttc'):
                font_path = os.path.join(font_dir, font_file)
                font_name = font_file.split('.')[0]
                font_files.append((font_path, font_name))

    # Generate images for each font file
    for font_path, font_name in font_files:
        # Output the font name so we can see the progress
        print(font_path, font_name)

        # Counter for the image filename
        j = 0
        for i in range(IMAGES_PER_FONT):  # Generate 50 images per font - reduced to 10 for now to make things faster
            # Random font size
            font_size = random.choice(range(18, 72))

            if font_path.endswith('.ttc'):
                # ttc fonts have multiple fonts in one file, so we need to specify which one we want
                font = ImageFont.truetype(font_path, font_size, index=0)
            elif font_name in FONT_EXCEPTS:
                continue
            else:
                # ttf fonts have only one font in the file
                font = ImageFont.truetype(font_path, font_size)

            # Determine the number of words that will fit on a line
            font_avg_char_width = font.getbbox('x')[2]
            words_per_line = int(800 / (font_avg_char_width * 5))
            prose_sample = random_prose_text(line_length=words_per_line)

            # print("generate font image: " + str(prose_sample))
            for text in [prose_sample]:
                img = Image.new('RGB', (800, 400), color="white")  # Canvas size
                draw = ImageDraw.Draw(img)

                # Random offsets, but ensuring that text isn't too far off the canvas
                offset_x = random.randint(-20, 10)
                offset_y = random.randint(-20, 10)

                # vary the line height
                line_height = random.uniform(0, 1.25) * font_size
                draw.text((offset_x, offset_y), text, fill="black", font=font, spacing=line_height)

                j += 1
                output_file = os.path.join(GEN_IMAGES_DIR, f"{font_name}_{j}.png")
                img.save(output_file)

源代码都记录在这里了:
https://github.com/chenzuoli/font-identifier

本代码参考开源项目:https://huggingface.co/gaborcselle/font-identifier

好了,记录到这里,持续更新中。

记录问题也是一种修行。

修行


欢迎关注微信公众号,你的资源可变现:【乐知付加密平台】

乐知付加密平台

欢迎关注微信公众号,这里记录博主的创业之旅:【程序员写书】

程序员写书

一起学习,一起进步。

标签:dirs,识别,批量,text,字体,path,line,font,os
From: https://www.cnblogs.com/chenzuoli/p/18596308

相关文章

  • 垃圾溢出监测识别摄像机
    垃圾溢出监测识别摄像机是一种应用于城市环境管理的智能设备,它能够帮助城市管理部门实时监测垃圾桶的填充情况,及时发现溢出情况并作出响应。该设备通常采用计算机视觉技术,结合图像识别算法,能够准确地识别垃圾桶的填充程度和溢出情况。在实际使用中,垃圾溢出监测识别摄像机首先会......
  • 河道漂浮物监测识别摄像机
    河道漂浮物监测识别摄像机利用先进的图像识别技术,通过智能算法,可以在河道和湖泊表面捕捉到漂浮的垃圾、塑料瓶、树叶等各种漂浮物,进行自动识别和提醒相关管理人员及清理,从而为环保部门提供准确的监测数据。河道漂浮物监测识别摄像机的应用具有诸多优势。首先,它能够大大减少对人......
  • 人流量监测识别摄像机
    人流量监测识别摄像机是一种基于人工智能技术的智能监控设备,其主要功能是通过摄像头捕捉实时画面,利用深度学习算法对画面中的人数进行实时识别和统计。这种摄像机可以广泛应用于各种场合,如商场、车站、学校、医院等公共场所,以及工厂、仓库等生产环境中,帮助管理者更好地了解实时人......
  • 工作服穿戴识别摄像机
    工作服穿戴识别摄像机是一种利用先进技术来识别和管理员工穿戴工作服的摄像机。这种摄像机通常包括使用RFID技术或者人脸识别技术,通过识别员工的身份和穿戴的工作服来确保员工符合安全规定和标准。工作服穿戴识别摄像机可以提高工作场所的安全性和管理效率:工作服穿戴识别摄像机是......
  • 船只监测识别摄像机
    船只识别监测摄像机是一种用于监测和识别船只的设备,它通过视频图像识别技术和智能算法来实现对船只的实时监测和识别。这种摄像机通常安装在海洋监测平台、港口码头、海岸线、湖泊、河道等位置,用于实现对船只航行情况的监测和跟踪。船只识别监测摄像机的工作原理是通过摄像头捕......
  • java批量修改hive_sql文件
    java批量修改hive_sql文件场景:需要批量迁移sql代码,有几百个sql文件按需要处理,一个个处理的非常费时费力修改要求:1:注释删除分区脚本--ALTERTABLEtest_db.clauseDROPpartition(pt_day='${hivevar:runDate}');2:新增清空表脚本truncatetabletest_db.claus......
  • Google PaliGemma 2 新增情绪识别能力;OpenAI 即将发布全新 Sora 视频生成器丨 RTE 开
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 使用 Vyper 编写简易文字识别程序
    Vyper是一种Python风格的智能合约编程语言,主要用于Ethereum区块链的智能合约开发。尽管Vyper主要应用于智能合约领域,我们依然可以用它来实现一些基础的程序逻辑。这篇文章将展示如何用Vyper编写一个基本的文字识别程序,通过处理用户输入的简单特征字符串来“识别”对应的......
  • 苹果手机群控技术大揭秘:解锁批量操作与远程管理的无限可能
    苹果手机群控技术是一种通过集中化的管理系统,实现对多台苹果设备(如iPhone、iPad等)进行远程监控、配置、更新及应用分发等功能的技术。这一技术的出现极大地提高了设备管理和操作的效率,广泛应用于企业、教育、商业等领域。苹果手机群控的核心功能‌批量操作‌:苹果手机群控技......
  • springboot毕设基于框架的生活垃圾识别与处理的科普网站源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展和人口的增长,生活垃圾的产生量日益增多,这对环境和人类健康都带来了诸多挑战。传统的垃圾处理方式面临着效率低下、分类不准确等问......