Files
go-pixelnebula/converter/converter.go
2025-03-19 21:10:19 +08:00

68 lines
1.7 KiB
Go

package converter
import (
"encoding/base64"
"regexp"
"strings"
)
var (
colorAttrRegex = regexp.MustCompile(`(?i)(fill|stroke):(?:#none|transparent)(?:;|\s|"|'|$)`)
)
type Converter interface {
ToBase64() (string, error)
ToPNG() ([]byte, error)
ToJPEG() ([]byte, error)
}
type SVGConverter struct {
svgData []byte
width int
height int
}
func NewSVGConverter(svgData []byte, width, height int) *SVGConverter {
processed := preprocessSVG(svgData)
return &SVGConverter{
svgData: processed,
width: width,
height: height,
}
}
func preprocessSVG(data []byte) []byte {
// 1. 移除动画元素
data = regexp.MustCompile(`<animateTransform[^>]*>`).ReplaceAll(data, []byte{})
// 2. 替换 fill:#none, fill:transparent 为 fill:#000000
processed := colorAttrRegex.ReplaceAllStringFunc(string(data), func(match string) string {
if strings.HasPrefix(strings.ToLower(match), "fill:") {
return "fill:#000;"
}
return match
})
return []byte(processed)
}
// ToBase64 returns the SVG data as a base64-encoded string.
func (c *SVGConverter) ToBase64() (string, error) {
return "data:image/svg+xml;base64," + base64.StdEncoding.EncodeToString(c.svgData), nil
}
// ToPNG returns the SVG data as a PNG image.
// Note: This is not implemented yet.
// Deprecated: It can't be perfectly implemented for the time being, so it's better to Use ToBase64 instead.
func (c *SVGConverter) ToPNG() ([]byte, error) {
// TODO: implement
return nil, nil
}
// ToJPEG returns the SVG data as a JPEG image.
// Note: This is not implemented yet.
// Deprecated: It can't be perfectly implemented for the time being, so it's better to Use ToBase64 instead.
func (c *SVGConverter) ToJPEG() ([]byte, error) {
// TODO: implement
return nil, nil
}