diff options
Diffstat (limited to 'internal/image/gemini_media.go')
| -rw-r--r-- | internal/image/gemini_media.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/internal/image/gemini_media.go b/internal/image/gemini_media.go new file mode 100644 index 0000000..f04ddd3 --- /dev/null +++ b/internal/image/gemini_media.go @@ -0,0 +1,66 @@ +package image + +import ( + "bytes" + "encoding/base64" + "fmt" + "image" + _ "image/jpeg" + "image/png" + "io" + "strings" +) + +func encodeDataURL(imageBytes []byte, mimeType string) (string, error) { + if len(imageBytes) == 0 { + return "", fmt.Errorf("no image bytes returned") + } + + normalizedBytes, err := normalizePNG(imageBytes, mimeType) + if err != nil { + return "", err + } + + return geminiDataPrefix + base64.StdEncoding.EncodeToString(normalizedBytes), nil +} + +func decodeDataURL(url string) (io.ReadCloser, error) { + header, payload, ok := strings.Cut(url, ",") + if !ok || !strings.HasPrefix(header, "data:") || !strings.Contains(header, ";base64") { + return nil, fmt.Errorf("unsupported data URI: %s", url) + } + + data, err := base64.StdEncoding.DecodeString(payload) + if err != nil { + return nil, fmt.Errorf("decode data URI: %w", err) + } + + return io.NopCloser(bytes.NewReader(data)), nil +} + +func normalizePNG(imageBytes []byte, mimeType string) ([]byte, error) { + if strings.EqualFold(strings.TrimSpace(mimeType), "image/png") { + return append([]byte(nil), imageBytes...), nil + } + + img, _, err := image.Decode(bytes.NewReader(imageBytes)) + if err != nil { + return nil, fmt.Errorf("decode generated image: %w", err) + } + + var buffer bytes.Buffer + if err := png.Encode(&buffer, img); err != nil { + return nil, fmt.Errorf("encode generated image as png: %w", err) + } + + return buffer.Bytes(), nil +} + +func decodedImageDimensions(imageBytes []byte) (int, int, error) { + cfg, _, err := image.DecodeConfig(bytes.NewReader(imageBytes)) + if err != nil { + return 0, 0, fmt.Errorf("decode generated image dimensions: %w", err) + } + + return cfg.Width, cfg.Height, nil +} |
