From 6cb0abf6d83d66a5ce04bd52aa33a2ba34b1ec88 Mon Sep 17 00:00:00 2001 From: Patrick Devine Date: Tue, 8 Oct 2024 18:46:58 -0700 Subject: [PATCH] add compositing for pngs --- server/imageproc/images.go | 22 +++++++++++++++++++--- server/imageproc/images_test.go | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/server/imageproc/images.go b/server/imageproc/images.go index b026f85c..03b3c010 100644 --- a/server/imageproc/images.go +++ b/server/imageproc/images.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "image" + "image/color" _ "image/jpeg" _ "image/png" "math" @@ -139,7 +140,22 @@ func splitToTiles(img image.Image, numTilesSize image.Point) []image.Image { return images } -func ResizeImage(img image.Image, outputSize image.Point, maxImageTiles int) (image.Image, image.Point) { +// remove the "alpha" channel by drawing over a prefilled image +func compositeImage(img image.Image) image.Image { + dst := image.NewRGBA(img.Bounds()) + + white := color.RGBA{255, 255, 255, 255} + draw.Draw(dst, dst.Bounds(), &image.Uniform{white}, image.Point{}, draw.Src) + draw.Draw(dst, dst.Bounds(), img, img.Bounds().Min, draw.Over) + + return dst +} + +func ResizeImage(img image.Image, format string, outputSize image.Point, maxImageTiles int) (image.Image, image.Point) { + if format == "png" { + img = compositeImage(img) + } + b := img.Bounds() tileSize := outputSize.Y @@ -217,12 +233,12 @@ func Preprocess(imageData []byte) ([]float32, int, error) { mean := [3]float32{0.48145466, 0.4578275, 0.40821073} std := [3]float32{0.26862954, 0.26130258, 0.27577711} - img, _, err := image.Decode(bytes.NewReader(imageData)) + img, format, err := image.Decode(bytes.NewReader(imageData)) if err != nil { return nil, 0, fmt.Errorf("failed to decode image: %w", err) } - newImage, aspectRatio := ResizeImage(img, outputSize, maxTiles) + newImage, aspectRatio := ResizeImage(img, format, outputSize, maxTiles) newImage = PadImage(newImage, outputSize, aspectRatio) data := PackImages(newImage, aspectRatio, mean, std) diff --git a/server/imageproc/images_test.go b/server/imageproc/images_test.go index 702f7555..e4455627 100644 --- a/server/imageproc/images_test.go +++ b/server/imageproc/images_test.go @@ -246,7 +246,7 @@ func TestResize(t *testing.T) { } for _, c := range cases { - actualImage, actualAspectRatio := ResizeImage(c.TestImage, c.OutputSize, c.MaxImageTiles) + actualImage, actualAspectRatio := ResizeImage(c.TestImage, "png", c.OutputSize, c.MaxImageTiles) if actualImage.Bounds() != c.ExpectedImage.Bounds() { t.Errorf("image size incorrect: '%#v': expected: '%#v'", actualImage.Bounds(), c.ExpectedImage.Bounds())