Ответ 1
Пакет golang.org/x/image/font
определяет интерфейсы для шрифтов и рисования текста на изображениях.
Вы можете использовать реализацию Go для растеризатора шрифтов Freetype: github.com/golang/freetype
.
Тип ключа freetype.Context
, он имеет все необходимые методы.
В качестве полного примера ознакомьтесь с этим файлом: example/freetype/main.go
. Этот пример загружает файл шрифта, создает и настраивает freetype.Context
, рисует текст на изображении и сохраняет изображение результата в файл.
Предположим, что у вас уже есть файл шрифта, и настроен контекст c
(см. пример, как это сделать). Тогда ваша функция addLabel()
может выглядеть так:
func addLabel(img *image.RGBA, x, y int, label string) {
c.SetDst(img)
size := 12.0 // font size in pixels
pt := freetype.Pt(x, y+int(c.PointToFixed(size)>>6))
if _, err := c.DrawString(label, pt); err != nil {
// handle error
}
}
Если вы не хотите нервничать с пакетами freetype
и внешними файлами шрифтов, пакет font/basicfont
содержит базовый шрифт с именем Face7x13
, чьи графические данные полностью автономны. Вот как вы могли бы это использовать:
import (
"golang.org/x/image/font"
"golang.org/x/image/font/basicfont"
"golang.org/x/image/math/fixed"
"image"
"image/color"
)
func addLabel(img *image.RGBA, x, y int, label string) {
col := color.RGBA{200, 100, 0, 255}
point := fixed.Point26_6{fixed.Int26_6(x * 64), fixed.Int26_6(y * 64)}
d := &font.Drawer{
Dst: img,
Src: image.NewUniform(col),
Face: basicfont.Face7x13,
Dot: point,
}
d.DrawString(label)
}
Вот как можно использовать эту функцию addLabel()
: приведенный ниже код создает новое изображение, рисует текст "Hello Go"
на нем и сохраняет его в файле с именем hello-go.png
:
func main() {
img := image.NewRGBA(image.Rect(0, 0, 300, 100))
addLabel(img, 20, 30, "Hello Go")
f, err := os.Create("hello-go.png")
if err != nil {
panic(err)
}
defer f.Close()
if err := png.Encode(f, img); err != nil {
panic(err)
}
}
Обратите внимание, что указанный выше код также требует "image/png"
импорта.
Также обратите внимание, что указанная координата y
будет нижней строкой текста. Поэтому, если вы хотите нарисовать линию в верхнем левом углу, вы должны использовать x = 0
и y = 13
(13 - высота этого шрифта Face7x13
). Если вы хотите, вы можете построить это в функции addLabel()
, вычитая 13
из координаты y
, так что переданная координата y
будет главной координатой, на которой будет нарисован текст.
Существует также дополнительный автономный шрифт в пакете golang.org/x/image/font/inconsolata
с обычным и полужирным шрифтом, чтобы использовать их, вам нужно только для указания другого Face
в addLabel()
:
import "golang.org/x/image/font/inconsolata"
// To use regular Inconsolata font family:
Face: inconsolata.Regular8x16,
// To use bold Inconsolata font family:
Face: inconsolata.Bold8x16,