54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
package image
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
|
|
"github.com/golang/freetype"
|
|
"github.com/golang/freetype/truetype"
|
|
"golang.org/x/image/font/gofont/goregular"
|
|
|
|
"douyu_go/internal/logger"
|
|
)
|
|
|
|
// LoadFont 预加载字体,优先使用本地或系统中文字体,缺失时使用内置字体兜底。
|
|
func LoadFont(fontFiles []string) *truetype.Font {
|
|
source, font, err := parseFirstFont(fontFiles)
|
|
if err != nil {
|
|
source = "内置 Go Regular 字体"
|
|
font, err = freetype.ParseFont(goregular.TTF)
|
|
if err != nil {
|
|
logger.LogEvent("字体", "error", "内置字体解析失败,成功图片功能将跳过: %v", err)
|
|
return nil
|
|
}
|
|
logger.LogEvent("字体", "warn", "未找到可用系统字体,使用内置字体兜底,中文可能显示不完整")
|
|
}
|
|
logger.LogEvent("字体", "success", "字体加载完成: %s", source)
|
|
return font
|
|
}
|
|
|
|
func parseFirstFont(candidates []string) (string, *truetype.Font, error) {
|
|
for _, path := range candidates {
|
|
if path == "" {
|
|
continue
|
|
}
|
|
fontBytes, err := os.ReadFile(path)
|
|
if err != nil {
|
|
if !errors.Is(err, os.ErrNotExist) {
|
|
logger.LogEvent("字体", "warn", "字体读取失败,已跳过: %s: %v", path, err)
|
|
}
|
|
continue
|
|
}
|
|
if len(fontBytes) == 0 {
|
|
continue
|
|
}
|
|
font, err := freetype.ParseFont(fontBytes)
|
|
if err != nil {
|
|
logger.LogEvent("字体", "warn", "字体解析失败,已跳过: %s: %v", path, err)
|
|
continue
|
|
}
|
|
return path, font, nil
|
|
}
|
|
return "", nil, errors.New("没有可用字体")
|
|
}
|