add local filesystem storage for packages and assets with upload handlers
This commit is contained in:
64
portal/internal/storage/icons.go
Normal file
64
portal/internal/storage/icons.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/png"
|
||||
"io"
|
||||
|
||||
// Import image formats for decoding
|
||||
_ "image/gif"
|
||||
_ "image/jpeg"
|
||||
|
||||
"golang.org/x/image/draw"
|
||||
)
|
||||
|
||||
// IconSizes defines the icon sizes to generate
|
||||
var IconSizes = []int{32, 64, 128}
|
||||
|
||||
// ProcessIcon reads an image and generates icons at multiple sizes
|
||||
func (s *Storage) ProcessIcon(appID string, r io.Reader) error {
|
||||
// Decode the image
|
||||
img, _, err := image.Decode(r)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to decode image: %w", err)
|
||||
}
|
||||
|
||||
// Validate square dimensions
|
||||
bounds := img.Bounds()
|
||||
if bounds.Dx() != bounds.Dy() {
|
||||
return fmt.Errorf("icon must be square, got %dx%d", bounds.Dx(), bounds.Dy())
|
||||
}
|
||||
|
||||
// Minimum size check
|
||||
if bounds.Dx() < 128 {
|
||||
return fmt.Errorf("icon must be at least 128x128, got %dx%d", bounds.Dx(), bounds.Dy())
|
||||
}
|
||||
|
||||
// Generate each size
|
||||
for _, size := range IconSizes {
|
||||
resized := resizeImage(img, size, size)
|
||||
|
||||
var buf bytes.Buffer
|
||||
if err := png.Encode(&buf, resized); err != nil {
|
||||
return fmt.Errorf("failed to encode icon-%d: %w", size, err)
|
||||
}
|
||||
|
||||
if err := s.SaveIcon(appID, size, buf.Bytes()); err != nil {
|
||||
return fmt.Errorf("failed to save icon-%d: %w", size, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// resizeImage resizes an image to the specified dimensions using high-quality interpolation
|
||||
func resizeImage(src image.Image, width, height int) image.Image {
|
||||
dst := image.NewRGBA(image.Rect(0, 0, width, height))
|
||||
|
||||
// Use CatmullRom for high-quality downscaling
|
||||
draw.CatmullRom.Scale(dst, dst.Bounds(), src, src.Bounds(), draw.Over, nil)
|
||||
|
||||
return dst
|
||||
}
|
||||
Reference in New Issue
Block a user