TrueTypeフォントをPNG画像に出力するGo言語コード

絵文字が豆腐になる。どうすればいいのかは要調査

package main

import (
    "bytes"
    "fmt"
    "image"
    "image/png"
    "io/ioutil"
    "os"

    "github.com/golang/freetype/truetype"
    "golang.org/x/image/font"
    "golang.org/x/image/math/fixed"
)

func main() {
    f, err := os.Open("Cica-Regular.ttf")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    ttfBytes, err := ioutil.ReadAll(f)
    if err != nil {
        panic(err)
    }

    ft, err := truetype.Parse(ttfBytes)
    if err != nil {
        panic(err)
    }

    opt := truetype.Options{
        Size:              24,
        DPI:               0,
        Hinting:           0,
        GlyphCacheEntries: 0,
        SubPixelsX:        0,
        SubPixelsY:        0,
    }

    text := "abcdefghijklmnopqrstuvwxyzあ亜!薔薇😀"

    face := truetype.NewFace(ft, &opt)

    b, a := font.BoundString(face, text)
    w := b.Max.X - b.Min.X + fixed.I(1)
    h := b.Max.Y - b.Min.Y + fixed.I(1)

    img := image.NewRGBA(image.Rect(0, 0, w.Ceil(), h.Ceil()))
    // draw.Draw(img, img.Bounds(), &image.Uniform{image.Black}, image.ZP, draw.Src)

    dr := &font.Drawer{
        Dst:  img,
        Src:  image.Black,
        Face: face,
        Dot:  fixed.Point26_6{},
    }

    dr.Dot.X = (w - a) / 2
    dr.Dot.Y = h - b.Max.Y

    dr.DrawString(text)

    buf := &bytes.Buffer{}
    err = png.Encode(buf, img)

    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }

    file, err := os.Create(`test.png`)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    defer file.Close()

    file.Write(buf.Bytes())
}

追記:

絵文字は出るやつと出ないやつがあるようだ。

f:id:bamch0h:20210124022012p:plain

↓以下のissueではまだ完全には絵文字は対応できていなさそう。

append emoji at the text is not showing emoji on the image output. · Issue #45 · golang/freetype · GitHub