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("没有可用字体") }