[Go] テキストを埋め込んだ画像ファイルを生成するライブラリを作った

質問箱的なサービスを作るために、任意のテキストが埋め込まれた画像をOGP用に動的に生成したかったので、自分で作った。

GitHub - shimiwaka/str2img: golang string to image library
golang string to image library. Contribute to shimiwaka/str2img development by creating an account on GitHub.

こういうコードで日本語を扱うのには一工夫必要らしくいろいろ情報が出てきたが、結局のところ、日本語に対応したフォントを使うだけで良いらしい。

このライブラリでは出力画像のサイズ・フォント・フォントサイズを指定することができ、そのままファイルとして出力する機能も持つ。httpなどで直にバイト列を返したいならファイル出力しないこともできる。

フォントはこのリポジトリには含まれていないので、ネットから適当な TrueType フォントを用意する必要がある。

フォントを用意してサンプルコードを実行すると、こんな感じになる。

package main

import (
	"bytes"
	"fmt"

	"github.com/shimiwaka/str2img"
)

func main() {
	generator := &str2img.Generator{
		ImageHeight: 630,
		ImageWidth:  1200,
		FontSize:    40.0,
		FontFile:    "Koruri-Regular.ttf",
		ImageBytes:  &bytes.Buffer{},
	}

	err := generator.Generate("テストてすとです\nほげほげほげ太郎\nほげ太郎")
	if err != nil {
		fmt.Printf("%v", err)
	}

	err = generator.OutputImageFile("test.png")
	if err != nil {
		fmt.Printf("%v", err)
	}
}

こんな感じでセンタリングされた文字列が表示される。改行にも対応している。

普通にやると改行は単なる文字として認識されて思ったような動作をしないので、与えられたテキストを改行文字で分割して、1行ずつ出力している。

文字数が多くて横幅をはみ出ても、自動的に改行され、画像に収まりきらない分は省略される。

画像サイズを小さくして折り返ししやすくしてみたが、こんな感じ。

ちなみに、文章の量に応じて画面を伸ばしていくことも考えたが、OGP用途であることを考えるとそれに意味はないので、省略する形で良しとした。

背景色や文字色を変える機能も追加しようかと思ったが、同様に、今回の自分の用途では必要としてないのでやめた。

文字列の折返しの処理あたりも結構いい加減なので、状況によっては画面をはみ出してしまったり変な文字が出力されることもあるかもしれない。あまりテストしていない。これは後々直していく予定。