GithubHelp home page GithubHelp logo

gsllchb / handright Goto Github PK

View Code? Open in Web Editor NEW
1.8K 19.0 233.0 40.79 MB

A lightweight Python library for simulating Chinese handwriting

License: BSD 3-Clause "New" or "Revised" License

Python 100.00%
handwriting chinese image simulation library lightweight

handright's People

Contributors

dependabot[bot] avatar gsllchb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

handright's Issues

部分文字显示不出来

请简明扼要地陈述您的问题。
image
当我在尝试使用handright生成指定字体的文字时,出现了如图所示的错误效果,想询问问题的原因和可能的解决方法

关于写字机的扩展特性 Feature required

Considering this project is aiming to simulate Chinese Characters, so this issue report is writing in Chinese.
写字机一般是使用gcode来描述刀头(笔)的运动的方向的。gcode是一连串的向量组成的文件,也就是模拟了人手在写字时的笔尖的移动。

Handright模拟出来的手写笔记非常非常的真实,而将这些模拟的图片使用写字机还原到纸上却有比较大的问题:

  • 由于使用PIL输出图片,只能够将图片转换成gcode向量文件,可由于汉字的笔画是有厚度的,导致了直接用现有的转换方式无法转换出最佳的路径。

潜在的解决方案:

  1. 将Handright输出图片转换为模拟人手写的gcode向量格式(优化困难)
  2. 使用已有的商业软件(炽写、奎享雕刻等)创建单线字字形的gcode向量文件,然后使用Handright将每一个笔顺的向量集合作为整体旋转平移(较为简单)
  3. 使用含有笔划及其位置的字库创建单线字字形

P.S.商业软件的单线字解决方案很简单粗暴,直接读取人手写的路径创建专门的字库,但这种做法也破坏了人手写的随机性.
P.S.2Handright对笔画的区分,受限于笔者代码水平,实在没看懂[doge]

示例:
商业软件的单线字生成gcode:
微信截图_20200808131032

使用Handright生成png图片之后使用软件自动转换为gcode:
微信截图_20200808131032

建议引进抗锯齿算法

生成的文字为单色文字,没有灰度变化,导致锯齿感始终比较强,建议引进抗锯齿算法

我字体大小以及设置为264了,按理来说分辨率还不错了,但还是由锯齿
image

iOS手写模拟APP推荐

推荐个iOS版的手写模拟APP——快笔。和Handright不同的是,它的字迹是靠用户自己录入的。因此,如果你找不到像自己字迹的字体的话,可以考虑下这个APP~~~

部署问题

Traceback (most recent call last):
File "k:\python\handwrite\main.py", line 8, in
font=ImageFont.truetype("font.ttf", size=100),
File "C:\Users\ZK\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\ImageFont.py", line 878, in truetype
return freetype(font)
File "C:\Users\ZK\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\ImageFont.py", line 875, in freetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File "C:\Users\ZK\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\ImageFont.py", line 226, in init
self.font = core.getfont(
OSError: cannot open resource

按照指示后,为什么会有OSError

AttributeError: 'FreeTypeFont' object has no attribute 'getsize'

  1. 您做了什么?
    运行了tutorial.md中的实例程序(我替换了字体路径和输出路径)
  2. 您希望发生什么?
    成功运行
  3. 实际上发生了什么?
    AttributeError: 'FreeTypeFont' object has no attribute 'getsize'
  4. python3, pillow9.5

请附上重现该bug的代码、图片(如果有的话)以及其它重现该bug所必须的东西。此外,重现bug的脚本应尽量使用最精简的代码以及最少的依赖项。

希望能支持axidraw

Feature

axidraw这个画图机器人网上很多。由于普通打印机智能打印一张一张纸,不能打印整本的笔记本,但是axidraw可以,而且还有笔的压痕,强烈建议加入axidraw支持

用户数量统计

我想统计一下PyLf的实际用户数。

倘若您曾经使用过此Python库,请给这个帖子:+1:。

由于:+1:是匿名的,因此你们也无需有任何顾虑。
突然发现发送表情并不是匿名的,对不起大家。。。

字体参数传入一个列表比较好,为了更像人写的

alpha和字体大小等扰动,我都试了一下,alpha大了点,字就飞了,小了效果几乎没有。
我觉得还是随机选择几个相似的手写字体比较好。 font参数传入一个列表,在_draw_text函数中每个字随机使用一个字体,这样是不是更加真实一点。

能不能添加一个行角度随机调节的功能

参数调整好后,已经很难分辨单个文字是否是手写还是打印的了
但是当A4纸打印出来整篇的文字后,会发现整体看上去还是不像手写的
因为行的水平角度太直了,一般白纸上手写文字,都会越写越向上偏,很难都是水平的
希望能添加一个行水平角度扰动参数,取值范围可能在 (90°, -90°) 之间,当然不可能这么大角度,一般就正负5°以内估计就差不多了
正数表示行越往右越向上偏,负数表示行越往右越向下偏
只是大概这么个想法,还不太完善,如果作者还会继续完善,那么可以深入讨论一下,谢谢
没有配图,不好意思

.

  1. 您做了什么?
  2. 您希望发生什么?
  3. 实际上发生了什么?
  4. 提供必要的环境信息(包括但不限于:Handright版本、Pillow版本、Python解释器及其版本、操作系统及其版本)

请附上重现该bug的代码、图片(如果有的话)以及其它重现该bug所必须的东西。此外,重现bug的脚本应尽量使用最精简的代码以及最少的依赖项。

功能建议

Feature

本人门外汉,正在努力入门python,提几条不成熟的建议

  1. 建议找一种办法将字体点阵化读取,输出的时候适当抖动,这样即使两个一样的字放在一起也不会看上去完全一样。
  2. 建议引入随机分布错别字接口。
  3. 能否考虑输出矢量pdf文件。(估计这个可能要完全重构吧,当没说吧。)
    可惜学艺不精,文科生学这个着实费劲,真希望能贡献一点力量

以字体为单位的变形

是否有可能引入字体的形变,使得高频率的字符相邻出现时显得更真实?
一种可能的方法也许是对字体先进行变形,再随机使用其中的字形?

进一步的,能否通过输入,学习出字体,从而解除对字体文件的依赖?

[huaji]也许会成为有趣的中文验证码生成/识别库?[/huaji]

中文仿手写体

想知道在params_visualizing一图中所用到的字体是,然后有没有比较好的仿手写体推荐

如果生成文字多于一张图片的话第二张图片似乎没有应用top_margin

  1. 做了什么?
    A:一段文字生成了多余一页图片
  2. 希望发生什么?
    A:第二页的顶部留空空间和第一张一样大
  3. 实际上发生了什么?
    A:第二页图片似乎没有留出top_margin参数应该预留的空间,导致我的第二张纸在背景图片中预留的题头空间多了一行字
  4. 提供必要的环境信息(包括但不限于:PyLf版本、Pillow版本、Python解释器及其版本、操作系统及其版本)
    Pillow 6.2.1
    handright 5.5.0
    Python 3.8
    Win10 MacOS 均复现

module 'handright' has no attribute 'TableWriter'

我想通过handright输出表格内容
代码如下

import handright as hr

    # 定义表格的行列数和内容
    rows = 4
    cols = 5
    data = [
        ['姓名', '年龄', '性别', '地址', '电话'],
        ['张三', '20', '男', '北京市朝阳区', '010-12345678'],
        ['李四', '22', '女', '上海市浦东新区', '021-87654321'],
        ['王五', '25', '男', '广州市天河区', '020-55555555']
    ]

    # 创建表格对象,并设置表格的样式
    table = hr.TableWriter(rows, cols, font_size=30, line_spacing=60, cell_width=180, cell_height=80, margin_top=100,
                           margin_left=100)

    # 绘制表格
    table.draw_table()

    # 写入内容
    for i in range(rows):
        for j in range(cols):
            table.write_text(data[i][j], i + 1, j + 1)

    # 显示表格
    table.show()

但是报错
table = hr.TableWriter(rows, cols, font_size=30, line_spacing=60, cell_width=180, cell_height=80, margin_top=100,
^^^^^^^^^^^^^^
AttributeError: module 'handright' has no attribute 'TableWriter'
请问正常的表格应该怎么写

投票:点阵图形还是矢量图形?

目前我遇到了一个两难的局面:继续走点阵图形这条路还是走矢量图形的路线?

点阵图形

优势

  • 点阵图形是目前所采用的方案,较为成熟
  • 便于对字形做扰动

劣势

  • 对打印不友好,易于出现锯齿等缺陷,若想达到视网膜级别的打印效果,无论是内存占用还是生成的图片都会异常巨大

矢量图形

优势

  • 打印效果优异

劣势

  • 不易于对笔画做扰动处理

我觉得对字形进行扰动的选择是对的,但我也觉得对矢量图形的路线貌似更自然也更优雅。你们觉得呢?

请在下面通过点赞的方式进行投票。欢迎发表自己的看法!

有没有做字库检查?

在处理大量数据的时候,可能会涉及到多个字体ttf,但每个ttf中的字种类并不相同,如果在绘制时出现了不存在的字,请问会返回什么呢?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.