From 711ad2f1028b460077a2bb3c3c1e3b87b7887938 Mon Sep 17 00:00:00 2001 From: Milan Nikolic Date: Fri, 13 Jun 2025 18:42:00 +0200 Subject: [PATCH] Add jpegli --- README.md | 1 + go.mod | 6 +++++- go.sum | 4 ++++ image/decode.go | 2 +- image/decode_jpegli.go | 31 +++++++++++++++++++++++++++++++ image/decode_libjpeg.go | 2 +- image/encode.go | 2 +- image/encode_jpegli.go | 35 +++++++++++++++++++++++++++++++++++ image/encode_libjpeg.go | 5 ++++- 9 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 image/decode_jpegli.go create mode 100644 image/encode_jpegli.go diff --git a/README.md b/README.md index 0d8e2c6..87f773e 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ You can also use apps like `ffplay` or `vlc`: * `opencv` - use `OpenCV` library to access camera ([gocv](https://github.com/hybridgroup/gocv)) * `libjpeg` - build with `libjpeg` ([go-libjpeg](https://github.com/pixiv/go-libjpeg)) instead of native Go `image/jpeg` +* `jpegli` - build with `jpegli` ([go-libjpeg](https://github.com/gen2brain/jpegli)) instead of native Go `image/jpeg` ### Download diff --git a/go.mod b/go.mod index 90f72d2..3d32c9e 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ require ( github.com/abbot/go-http-auth v0.4.0 github.com/anthonynsimon/bild v0.14.0 github.com/gen2brain/base64 v0.0.0-20221015184129-317a5c93030c + github.com/gen2brain/jpegli v0.3.4 github.com/jamiealquiza/envy v1.1.0 github.com/korandiz/v4l v1.1.0 github.com/pbnjay/pixfont v0.0.0-20200714042608-33b744692567 @@ -16,9 +17,12 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/tetratelabs/wazero v1.9.0 // indirect golang.org/x/crypto v0.18.0 // indirect golang.org/x/net v0.20.0 // indirect golang.org/x/sys v0.16.0 // indirect ) -go 1.21 +go 1.23 + +toolchain go1.24.3 diff --git a/go.sum b/go.sum index 18607a3..a2be0f6 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,8 @@ github.com/anthonynsimon/bild v0.14.0/go.mod h1:hcvEAyBjTW69qkKJTfpcDQ83sSZHxwOu github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/gen2brain/base64 v0.0.0-20221015184129-317a5c93030c h1:TUjjeJ2rV4KZxH6hIEi/boEQB3v6aKvwdakUJR3AwiE= github.com/gen2brain/base64 v0.0.0-20221015184129-317a5c93030c/go.mod h1:VG58IUyxPWojCtGwqwoZ/6LLXwClu1tssqa5ktOxI9o= +github.com/gen2brain/jpegli v0.3.4 h1:wFoUHIjfPJGGeuW3r9dqy0MTT1TtvJuWf6EqfHPPGFM= +github.com/gen2brain/jpegli v0.3.4/go.mod h1:tVnF7NPyufTo8noFlW5lurUUwZW8trwBENOItzuk2BM= github.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -22,6 +24,8 @@ github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I= +github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM= gocv.io/x/gocv v0.35.0 h1:Qaxb5KdVyy8Spl4S4K0SMZ6CVmKtbfoSGQAxRD3FZlw= gocv.io/x/gocv v0.35.0/go.mod h1:oc6FvfYqfBp99p+yOEzs9tbYF9gOrAQSeL/dyIPefJU= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= diff --git a/image/decode.go b/image/decode.go index bcc2723..a890996 100644 --- a/image/decode.go +++ b/image/decode.go @@ -1,4 +1,4 @@ -//go:build !libjpeg +//go:build !libjpeg && !jpegli // Package image. package image diff --git a/image/decode_jpegli.go b/image/decode_jpegli.go new file mode 100644 index 0000000..5a0f475 --- /dev/null +++ b/image/decode_jpegli.go @@ -0,0 +1,31 @@ +//go:build jpegli + +// Package image. +package image + +import ( + "image" + "io" + + "github.com/gen2brain/jpegli" +) + +// NewDecoder returns a new Decoder. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{r} +} + +// Decoder struct. +type Decoder struct { + r io.Reader +} + +// Decode decodes image from JPEG. +func (d Decoder) Decode() (image.Image, error) { + return jpegli.DecodeWithOptions(d.r, &jpegli.DecodingOptions{ + DCTMethod: jpegli.DCTIFast, + FancyUpsampling: false, + BlockSmoothing: false, + ArithCode: true, + }) +} diff --git a/image/decode_libjpeg.go b/image/decode_libjpeg.go index 031a6c7..7219b61 100644 --- a/image/decode_libjpeg.go +++ b/image/decode_libjpeg.go @@ -23,7 +23,7 @@ type Decoder struct { // Decode decodes image from JPEG. func (d Decoder) Decode() (image.Image, error) { return jpeg.Decode(d.r, &jpeg.DecoderOptions{ - DCTMethod: jpeg.DCTFloat, + DCTMethod: jpeg.DCTIFast, DisableFancyUpsampling: true, DisableBlockSmoothing: true, }) diff --git a/image/encode.go b/image/encode.go index ed9dd19..c4d462d 100644 --- a/image/encode.go +++ b/image/encode.go @@ -1,4 +1,4 @@ -//go:build !libjpeg +//go:build !libjpeg && !jpegli // Package image. package image diff --git a/image/encode_jpegli.go b/image/encode_jpegli.go new file mode 100644 index 0000000..38f8492 --- /dev/null +++ b/image/encode_jpegli.go @@ -0,0 +1,35 @@ +//go:build jpegli + +// Package image. +package image + +import ( + "image" + "io" + + "github.com/gen2brain/jpegli" +) + +// NewEncoder returns a new Encoder. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{w} +} + +// Encoder struct. +type Encoder struct { + w io.Writer +} + +// Encode encodes image to JPEG. +func (e Encoder) Encode(img image.Image) error { + return jpegli.Encode(e.w, img, &jpegli.EncodingOptions{ + Quality: 75, + ProgressiveLevel: 0, + ChromaSubsampling: image.YCbCrSubsampleRatio420, + DCTMethod: jpegli.DCTIFast, + OptimizeCoding: false, + AdaptiveQuantization: false, + StandardQuantTables: false, + FancyDownsampling: false, + }) +} diff --git a/image/encode_libjpeg.go b/image/encode_libjpeg.go index 1fa26c7..551f8ce 100644 --- a/image/encode_libjpeg.go +++ b/image/encode_libjpeg.go @@ -23,6 +23,9 @@ type Encoder struct { // Encode encodes image to JPEG. func (e Encoder) Encode(img image.Image) error { return jpeg.Encode(e.w, img, &jpeg.EncoderOptions{ - Quality: 75, + Quality: 75, + DCTMethod: jpeg.DCTIFast, + ProgressiveMode: false, + OptimizeCoding: false, }) }