From c0545269981e765d1e5694c8c95b8edb2f209a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Verstraeten?= Date: Wed, 30 Jul 2025 12:06:12 +0000 Subject: [PATCH] Add image resizing functionality and update dependencies - Introduced ResizeImage function to resize images before encoding. - Updated ImageToBytes function to accept pointer to image. - Added nfnt/resize library for image resizing. - Updated go.mod and go.sum to include new dependencies. - Updated image processing in HandleLiveStreamSD, GetSnapshotRaw, and other functions to use resized images. - Updated yarn.lock for ui package version change. --- machinery/go.mod | 3 ++- machinery/go.sum | 2 ++ machinery/src/capture/main.go | 3 ++- machinery/src/cloud/Cloud.go | 6 ++++-- machinery/src/components/Kerberos.go | 3 ++- machinery/src/routers/websocket/main.go | 3 ++- machinery/src/utils/main.go | 18 ++++++++++++++++-- ui/yarn.lock | 8 ++++---- 8 files changed, 34 insertions(+), 12 deletions(-) diff --git a/machinery/go.mod b/machinery/go.mod index 603144e..d019f5c 100644 --- a/machinery/go.mod +++ b/machinery/go.mod @@ -26,6 +26,7 @@ require ( github.com/kerberos-io/joy4 v1.0.64 github.com/kerberos-io/onvif v1.0.0 github.com/minio/minio-go/v6 v6.0.57 + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/pion/interceptor v0.1.40 github.com/pion/rtp v1.8.19 @@ -41,6 +42,7 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 go.opentelemetry.io/otel/sdk v1.36.0 + go.opentelemetry.io/otel/trace v1.36.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) @@ -118,7 +120,6 @@ require ( github.com/ziutek/mymysql v1.5.4 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect - go.opentelemetry.io/otel/trace v1.36.0 // indirect go.opentelemetry.io/proto/otlp v1.6.0 // indirect golang.org/x/arch v0.16.0 // indirect golang.org/x/crypto v0.38.0 // indirect diff --git a/machinery/go.sum b/machinery/go.sum index 216127e..c224964 100644 --- a/machinery/go.sum +++ b/machinery/go.sum @@ -847,6 +847,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= diff --git a/machinery/src/capture/main.go b/machinery/src/capture/main.go index 0ec637d..4ad180c 100644 --- a/machinery/src/capture/main.go +++ b/machinery/src/capture/main.go @@ -757,7 +757,8 @@ func Base64Image(captureDevice *Capture, communication *models.Communication) st var img image.YCbCr img, err = (*rtspClient).DecodePacket(pkt) if err == nil { - bytes, _ := utils.ImageToBytes(&img) + imageResized, _ := utils.ResizeImage(&img, 100000) + bytes, _ := utils.ImageToBytes(imageResized) encodedImage = base64.StdEncoding.EncodeToString(bytes) break } else { diff --git a/machinery/src/cloud/Cloud.go b/machinery/src/cloud/Cloud.go index 9bba493..e830cc8 100644 --- a/machinery/src/cloud/Cloud.go +++ b/machinery/src/cloud/Cloud.go @@ -706,7 +706,8 @@ func HandleLiveStreamSD(livestreamCursor *packets.QueueCursor, configuration *mo log.Log.Info("cloud.HandleLiveStreamSD(): Sending base64 encoded images to MQTT.") img, err := rtspClient.DecodePacket(pkt) if err == nil { - bytes, _ := utils.ImageToBytes(&img) + imageResized, _ := utils.ResizeImage(&img, 100000) + bytes, _ := utils.ImageToBytes(imageResized) chunking := config.Capture.LiveviewChunking @@ -864,7 +865,8 @@ func HandleRealtimeProcessing(processingCursor *packets.QueueCursor, configurati log.Log.Info("cloud.RealtimeProcessing(): Sending base64 encoded images to MQTT.") img, err := rtspClient.DecodePacket(pkt) if err == nil { - bytes, _ := utils.ImageToBytes(&img) + imageResized, _ := utils.ResizeImage(&img, 100000) + bytes, _ := utils.ImageToBytes(imageResized) encoded := base64.StdEncoding.EncodeToString(bytes) valueMap := make(map[string]interface{}) diff --git a/machinery/src/components/Kerberos.go b/machinery/src/components/Kerberos.go index 0b823b7..e29c380 100644 --- a/machinery/src/components/Kerberos.go +++ b/machinery/src/components/Kerberos.go @@ -698,7 +698,8 @@ func GetSnapshotRaw(c *gin.Context, captureDevice *capture.Capture, configuratio image := capture.JpegImage(captureDevice, communication) // encode image to jpeg - bytes, _ := utils.ImageToBytes(&image) + imageResized, _ := utils.ResizeImage(&image, 100000) + bytes, _ := utils.ImageToBytes(imageResized) // Return image/jpeg c.Data(200, "image/jpeg", bytes) diff --git a/machinery/src/routers/websocket/main.go b/machinery/src/routers/websocket/main.go index 62c3dce..c8b9ffc 100644 --- a/machinery/src/routers/websocket/main.go +++ b/machinery/src/routers/websocket/main.go @@ -159,7 +159,8 @@ logreader: var img image.YCbCr img, err = (*rtspClient).DecodePacket(pkt) if err == nil { - bytes, _ := utils.ImageToBytes(&img) + imageResized, _ := utils.ResizeImage(&img, 100000) + bytes, _ := utils.ImageToBytes(imageResized) encodedImage = base64.StdEncoding.EncodeToString(bytes) } else { continue diff --git a/machinery/src/utils/main.go b/machinery/src/utils/main.go index d7744dc..76a54a0 100644 --- a/machinery/src/utils/main.go +++ b/machinery/src/utils/main.go @@ -21,6 +21,8 @@ import ( "github.com/kerberos-io/agent/machinery/src/encryption" "github.com/kerberos-io/agent/machinery/src/log" "github.com/kerberos-io/agent/machinery/src/models" + + "github.com/nfnt/resize" ) const VERSION = "3.5.0" @@ -401,9 +403,21 @@ func Decrypt(directoryOrFile string, symmetricKey []byte) { } } -func ImageToBytes(img image.Image) ([]byte, error) { +func ImageToBytes(img *image.Image) ([]byte, error) { buffer := new(bytes.Buffer) w := bufio.NewWriter(buffer) - err := jpeg.Encode(w, img, &jpeg.Options{Quality: 15}) + err := jpeg.Encode(w, *img, &jpeg.Options{Quality: 35}) + fmt.Println("ImageToBytes() - buffer size: ", buffer.Len()) return buffer.Bytes(), err } + +func ResizeImage(img image.Image, maxSize uint64) (*image.Image, error) { + if img == nil { + return nil, errors.New("image is nil") + } + + // resize to width 640 using Lanczos resampling + // and preserve aspect ratio + m := resize.Resize(640, 0, img, resize.Lanczos3) + return &m, nil +} diff --git a/ui/yarn.lock b/ui/yarn.lock index 7a9c147..54f7f5b 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1715,10 +1715,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@kerberos-io/ui@^1.71.0": - version "1.71.0" - resolved "https://registry.yarnpkg.com/@kerberos-io/ui/-/ui-1.71.0.tgz#06914c94e8b0982068d2099acf8158917a511bfc" - integrity sha512-pHCTn/iQTcQEPoCK82eJHGRn6BgzW3wgV4C+mNqdKOtLTquxL+vh7molEgC66tl3DGf7HyjSNa8LuoxYbt9TEg== +"@kerberos-io/ui@^1.76.0": + version "1.77.0" + resolved "https://registry.yarnpkg.com/@kerberos-io/ui/-/ui-1.77.0.tgz#b748b2a9abf793ff2a9ba64ee41f84debc0ca9dc" + integrity sha512-CHh4jeLKwrYvJRL5PM3UEN4p2k1fqwMKgSF2U6IR4v0fE2FwPc/2Ry4zGk6pvLDFHbDpR9jUkHX+iNphvStoyQ== dependencies: "@emotion/react" "^11.10.4" "@emotion/styled" "^11.10.4"