package imageutil import ( "bytes" "fmt" "image" _ "image/gif" _ "image/jpeg" _ "image/png" "io" "github.com/chai2010/webp" ) type ProcessOptions struct { Lossless bool Quality float32 // 0-100 Compression int // 0-6 } // DefaultOptions returns default processing options func DefaultOptions() ProcessOptions { return ProcessOptions{ Lossless: true, Quality: 90, Compression: 4, } } // ProcessImage converts any supported image to WebP format func ProcessImage(input io.Reader, opts ProcessOptions) ([]byte, error) { // Decode the original image img, _, err := image.Decode(input) if err != nil { return nil, fmt.Errorf("failed to decode image: %w", err) } // Encode to WebP var buf bytes.Buffer if err := webp.Encode(&buf, img, &webp.Options{ Lossless: opts.Lossless, Quality: opts.Quality, Exact: true, }); err != nil { return nil, fmt.Errorf("failed to encode to WebP: %w", err) } return buf.Bytes(), nil } // IsImageFormat checks if the given format is a supported image format func IsImageFormat(contentType string) bool { switch contentType { case "image/jpeg", "image/png", "image/gif", "image/webp": return true default: return false } }