0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語を画像に描くならフォントを名前で選ばない — Hiragino Sans GB は中国語版だった

0
Last updated at Posted at 2026-09-22

はじめに

📝 この記事は note ・ Zenn にも投稿しています。

2026-07-27、画像生成モデルの Qwen-Image-2512 に、店先の看板を描かせた。看板の文字は「営業中」。

出てきた看板は、字画も整っていて崩れていない。拡大して見るまでは合格に見えていた。

上の部分が違った。日本の「営」は上がツ(⺍)の形をしている。看板の字は、上に「火」が2つ並んでいた。**繁体字の「營」**だった。

プロンプトで「日本の新字体で、中国の漢字ではなく」と明示しても、日本の店先という文脈を足しても、「營」のまま変わらなかった。

そこで、文字だけは日本語フォントで画像に描いておき、それを画像編集モデル(Qwen-Image-Edit)で看板に馴染ませる方法に切り替えた。モデルに字を考えさせない。

この方法で、別の落とし穴に当たった。

「營」は別の文字だった

最初に切り分けておくと、看板の「營」はフォントの問題ではない。

字 コードポイント
営 U+55B6 日本の新字体
營 U+71DF 繁体字・旧字体
营 U+8425 簡体字

3つは別々の文字として符号化されている。U+55B6 はどのフォントで描いても「営」になる。モデルが描いたのは、文字そのものを取り違えた結果だった。

フォント画像を渡す方法なら、この取り違えは起きない。問題はもうひとつのほうにあった。

同じコードポイントでも形が変わる

Unicode は文字を符号化していて、字形は符号化していない。日本・中国・台湾などで少しずつ形が違う漢字を、同じ文字として1つのコードポイントにまとめている。これを Han Unification(漢字統合)と呼ぶ。

どの地域の形で描くかは、フォントが決める。Unicode のFAQも、地域ごとの正しい字形で描き分けるのはフォントの役目で、日本語のテキストには日本語向けのフォントを使う、としている。

macOS で、同じコードポイントをフォントだけ変えて描いた。

骨・直・海・今 の4文字を上下2段で比べた画像。上段(JP)はヒラギノ角ゴシック、下段(CN)は Hiragino Sans GB で描いたもの。海の右側が点2つか横棒か、骨の上部の向き、直の左下の繋がり、今の下部が横棒か点かで形が違う

同じコードポイントを、フォントだけ変えて描いたもの。上が日本語版、下が中国語版

字 ヒラギノ角ゴシック(日本語) Hiragino Sans GB(中国語)
海 U+6D77 右下が点2つの「母」 点ではなく横棒が1本通る
骨 U+9AA8 上の箱の中が左に折れる 右に折れる。向きが逆
直 U+76F4 左下が「L」字に繋がる 下は横棒で閉じ、左の縦棒は短い
今 U+4ECA 下の部分の1画目が横棒 斜めの点になる

文字コードは完全に同じ。違うのはフォントファイルだけだ。

「ヒラギノ」を名前で選ぶと中国語版を掴む

macOS には Hiragino Sans GB.ttc というフォントが入っている。名前に「ヒラギノ」が付いているが、GB は簡体字中国語の規格を指す。中国語向けの版だ。

日本語のつもりでこれを選ぶと、上の表の右側の字形で描かれる。しかも「文字はちゃんと出ている」ので、見た目では気づきにくい。

同じことは、フォントを指定しない場合にも起きうる。Pillow の既定フォントに任せたり、日本語フォントが入っていないサーバや Docker の中で描いたりすると、フォールバック先の中国語フォントで描かれることがある。

フォント画像を画像編集モデルに渡す方法では、これが致命的になる。

画像編集モデルは、元の字形を忠実に守った

「骨直海」の3文字を、日本語フォントと中国語フォントでそれぞれ描き、両方を Qwen-Image-Edit に通した。

元画像のフォント 出力の字形
ヒラギノ角ゴシック 日本の字形のまま
Hiragino Sans GB 中国の字形のまま

編集モデルは、渡された字形をそのまま保った。 正しい字形も、誤った字形も同じように保つ。中国語フォントで元画像を描けば、モデルに考えさせない代わりに、中国の字形を自分の手で注入することになる。

検証に使う字を、一度間違えた

この実験には、うまくいかなかった1回目がある。

最初は「営業中」を日本語フォントと中国語フォントで描き分けて、差を測ろうとした。差分は 3.37%。地域差の無い字どうしを比べた対照群の平均 8.32% より小さく、何も示せなかった。

原因は字の選び方にあった。「営」は U+55B6 という日本の字のコードポイントで、中国語フォントで描いても形は変わらない。「業」「中」は日中で同じ形をしている。Han Unification の差が出ない字だけで、Han Unification を検証していた。

字を「骨直海」に替えて、上の結果が出た。

差分の数値では判定できなかった

もうひとつ、測り方も合っていなかった。

1024×1024 の画像に3文字を置くと、画面の大半は背景になる。元画像どうしでも、画素の差分は 4.15% にしかならない。

さらに、ヒラギノ角ゴシックと Hiragino Sans GB は、地域差とは別に書体そのもののデザインも違う。地域差の無い字の組(8.32%)と、ある字の組(13.21%)で、差分のレンジが重なった。画素の差分では、字形の違いと書体の違いを分けられない。

判定は、拡大して参照の字形と見比べる目視に切り替えた。

フォントはパスで指定する

日本語を画像に描くときは、フォントファイルを明示する。

from PIL import Image, ImageDraw, ImageFont

JP = "/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc"   # 日本語版
# CN = "/System/Library/Fonts/Hiragino Sans GB.ttc"   # 中国語版(名前に注意)

img = Image.new("RGB", (900, 260), "white")
d = ImageDraw.Draw(img)
d.text((20, 20), "骨直海今", font=ImageFont.truetype(JP, 200), fill="black")
img.save("glyph_jp.png")

JP を CN に差し替えて同じ字を描けば、上の表の違いが手元で出る。

できた画像を検品するときは、日中で形が同じ字では合格に見えてしまう。確かめる字は、日本・簡体字・繁体字の3系統で形が分かれる字を入れた。

広 駅 図 気 円 売 楽 経

「業」「中」「会」のような字だけで確認して、合格にはしない。


画像生成モデルに日本語を書かせると、プロンプトで指定しても8字すべてが日本の字形にならなかった。フォントで描いた文字を画像として持ち込み、編集モデルに絵に仕立ててもらうと、試した4通りすべてで字形が保たれた。この方法では元画像を描いたフォントの字形がそのまま出るので、ここで書いたフォントの選び方がそのまま効く。手順は本の7章に書いた。

👉 M2 Mac で画像生成AIをローカルで動かす(Zenn の有料本・1,000円・1章まで無料)


「文字は出ている」と確認して、形までは見ていなかった。
同じ文字コードの字を2つ並べて、違う形が出てくるとは思っていなかった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?