diff options
| author | Xe Iaso <me@xeiaso.net> | 2024-05-28 10:08:04 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2024-05-28 10:09:26 -0400 |
| commit | 479407203e6d6654974a4bd340f576cb0b167f55 (patch) | |
| tree | d3c78f9ad4fee1ab1e51b735218764be27ce799f /cmd/xedn | |
| parent | 79d43f5be33f97b36402ec8de7db51e36b1e7f45 (diff) | |
| download | x-479407203e6d6654974a4bd340f576cb0b167f55.tar.xz x-479407203e6d6654974a4bd340f576cb0b167f55.zip | |
internal/avif: remove this package
Replace this with a bunch of smaller packages that embed WebAssembly
libraries for the following functionality:
* AVIF encoding
* JXL encoding
* WEBP encoding
Also include HEIC decoding and add JXL encoding support to uploud/xedn
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd/xedn')
| -rw-r--r-- | cmd/xedn/imgoptimize.go | 10 | ||||
| -rw-r--r-- | cmd/xedn/uplodr/main.go | 56 |
2 files changed, 46 insertions, 20 deletions
diff --git a/cmd/xedn/imgoptimize.go b/cmd/xedn/imgoptimize.go index 5b509e7..c82c362 100644 --- a/cmd/xedn/imgoptimize.go +++ b/cmd/xedn/imgoptimize.go @@ -15,12 +15,14 @@ import ( "strings" "time" - "github.com/chai2010/webp" "github.com/disintegration/imaging" + "github.com/gen2brain/avif" + _ "github.com/gen2brain/heic" + _ "github.com/gen2brain/jpegxl" + "github.com/gen2brain/webp" "go.etcd.io/bbolt" "golang.org/x/sync/singleflight" "tailscale.com/metrics" - "within.website/x/internal/avif" ) type OptimizedImageServer struct { @@ -138,11 +140,11 @@ func (ois *OptimizedImageServer) ResizeTo(widthPixels int, character, mood, form return nil, err } case "webp": - if err := webp.Encode(&result, dstImg, &webp.Options{Quality: 95}); err != nil { + if err := webp.Encode(&result, dstImg, webp.Options{Quality: 95}); err != nil { return nil, err } case "avif": - if err := avif.Encode(&result, dstImg, &avif.Options{Quality: 48, Speed: avif.MaxSpeed}); err != nil { + if err := avif.Encode(&result, dstImg, avif.Options{Quality: 95, Speed: 7}); err != nil { return nil, err } default: diff --git a/cmd/xedn/uplodr/main.go b/cmd/xedn/uplodr/main.go index e1a9c10..148a0e6 100644 --- a/cmd/xedn/uplodr/main.go +++ b/cmd/xedn/uplodr/main.go @@ -14,18 +14,19 @@ import ( "net" "os" "path/filepath" - "runtime" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/chai2010/webp" "github.com/disintegration/imaging" + "github.com/gen2brain/avif" + _ "github.com/gen2brain/heic" + "github.com/gen2brain/jpegxl" + "github.com/gen2brain/webp" "google.golang.org/grpc" "within.website/x/cmd/xedn/uplodr/pb" "within.website/x/internal" - "within.website/x/internal/avif" "within.website/x/tigris" ) @@ -40,12 +41,10 @@ var ( tigrisBucket = flag.String("bucket-name", "xedn", "Tigris bucket to dump things to") - avifQuality = flag.Int("avif-quality", 8, "AVIF quality (higher is worse quality)") avifEncoderSpeed = flag.Int("avif-encoder-speed", 0, "AVIF encoder speed (higher is faster)") - - jpegQuality = flag.Int("jpeg-quality", 90, "JPEG quality (lower means lower file size)") - - webpQuality = flag.Int("webp-quality", 9, "WEBP quality (higher is worse quality)") + jxlEffort = flag.Int("jxl-effort", 7, "JPEG XL encoding effort in the range [1,10]. Sets encoder effort/speed level without affecting decoding speed. Default is 7.") + imageQuality = flag.Int("image-quality", 85, "image quality (lower means lower file size)") + webpMethod = flag.Int("webp-method", 4, "WebP encoding method (0-6, 0 is fastest-worst, 6 is slowest-best)") ) func main() { @@ -195,7 +194,7 @@ func (s *Server) Upload(ctx context.Context, ur *pb.UploadReq) (*pb.UploadResp, errs = append(errs, fmt.Errorf("while uploading %s to b2: %w", path, err)) continue } - slog.Debug("uploaded", "to", "tigris", "key", key) + slog.Debug("uploaded", "to", "b2", "key", key) result = append(result, &pb.Variant{ Url: fmt.Sprintf("https://cdn.xeiaso.net/file/christine-static/%s/%s", ur.GetFolder(), fname), @@ -221,16 +220,36 @@ func doAVIF(src image.Image, dstPath string) error { } defer dst.Close() - err = avif.Encode(dst, src, &avif.Options{ - Threads: runtime.GOMAXPROCS(0), - Speed: *avifEncoderSpeed, - Quality: *avifQuality, + if err := avif.Encode(dst, src, avif.Options{ + Quality: *imageQuality, + QualityAlpha: *imageQuality, + Speed: *avifEncoderSpeed, + }); err != nil { + return err + } + + log.Printf("Encoded AVIF at %s", dstPath) + + return nil +} + +func doJXL(src image.Image, dstPath string) error { + dst, err := os.Create(dstPath) + if err != nil { + log.Fatalf("Can't create destination file: %v", err) + } + defer dst.Close() + + err = jpegxl.Encode(dst, src, jpegxl.Options{ + Quality: *imageQuality, + Effort: *jxlEffort, }) + if err != nil { return err } - log.Printf("Encoded AVIF at %s", dstPath) + log.Printf("Encoded JPEG XL at %s", dstPath) return nil } @@ -242,7 +261,10 @@ func doWEBP(src image.Image, dstPath string) error { } defer fout.Close() - err = webp.Encode(fout, src, &webp.Options{Quality: float32(*webpQuality)}) + err = webp.Encode(fout, src, webp.Options{ + Quality: *imageQuality, + Method: *webpMethod, + }) if err != nil { return err } @@ -263,7 +285,9 @@ func doJPEG(src image.Image, dstPath string) error { } defer fout.Close() - if err := jpeg.Encode(fout, src, &jpeg.Options{Quality: *jpegQuality}); err != nil { + if err := jpeg.Encode(fout, src, &jpeg.Options{ + Quality: *imageQuality, + }); err != nil { return err } |
