diff options
| author | ivar <i@oiee.no> | 2026-04-04 16:41:39 +0200 |
|---|---|---|
| committer | ivar <i@oiee.no> | 2026-04-04 16:41:39 +0200 |
| commit | 3ffe741c0b8032f65d3b5e1770b840dc34bbb72f (patch) | |
| tree | a7a6bb2eb7f63761737d534edb72ffa8f65b35cd /internal/media/process.go | |
| parent | bcae026b1fa46d952c8f2607278e1f0a640793c0 (diff) | |
| download | nebbet.no-3ffe741c0b8032f65d3b5e1770b840dc34bbb72f.tar.xz nebbet.no-3ffe741c0b8032f65d3b5e1770b840dc34bbb72f.zip | |
feat: add govips ConvertAndResize wrapper
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/media/process.go')
| -rw-r--r-- | internal/media/process.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/internal/media/process.go b/internal/media/process.go new file mode 100644 index 0000000..bb3ac89 --- /dev/null +++ b/internal/media/process.go @@ -0,0 +1,46 @@ +package media + +import ( + "fmt" + + "github.com/davidbyttow/govips/v2/vips" +) + +// ConvertAndResize loads the image at src, optionally resizes it to width pixels +// wide (maintaining aspect ratio), and exports it in the requested format. +// +// width <= 0 means no resize. format must be "webp" or "jpeg". +func ConvertAndResize(src string, width int, format string) ([]byte, error) { + if format != "webp" && format != "jpeg" { + return nil, fmt.Errorf("unsupported format %q: must be webp or jpeg", format) + } + + img, err := vips.NewImageFromFile(src) + if err != nil { + return nil, fmt.Errorf("load image %s: %w", src, err) + } + defer img.Close() + + if width > 0 && width < img.Width() { + scale := float64(width) / float64(img.Width()) + if err := img.Resize(scale, vips.KernelLanczos3); err != nil { + return nil, fmt.Errorf("resize: %w", err) + } + } + + switch format { + case "webp": + buf, _, err := img.ExportWebp(vips.NewWebpExportParams()) + if err != nil { + return nil, fmt.Errorf("export webp: %w", err) + } + return buf, nil + case "jpeg": + buf, _, err := img.ExportJpeg(vips.NewJpegExportParams()) + if err != nil { + return nil, fmt.Errorf("export jpeg: %w", err) + } + return buf, nil + } + return nil, fmt.Errorf("unsupported format %q", format) +} |
