cvm-rs: allow setting JPEG quality from JS

This commit is contained in:
modeco80
2025-06-05 16:45:46 -04:00
parent 23c57dbb3b
commit 857eb46d2a
3 changed files with 10 additions and 4 deletions

2
cvm-rs/index.d.ts vendored
View File

@@ -9,6 +9,7 @@ interface JpegInputArgs {
height: number; height: number;
stride: number; // The width of your input framebuffer OR your image width (if encoding a full image) stride: number; // The width of your input framebuffer OR your image width (if encoding a full image)
buffer: Buffer; buffer: Buffer;
quality: number;
// TODO: Allow different formats, or export a boxed ffi object which can store a format // TODO: Allow different formats, or export a boxed ffi object which can store a format
// (i.e: new JpegEncoder(FORMAT_xxx)). // (i.e: new JpegEncoder(FORMAT_xxx)).
@@ -20,6 +21,7 @@ interface JpegResizeInputArgs {
desiredWidth: number; // dest width desiredWidth: number; // dest width
desiredHeight: number; // dest height desiredHeight: number; // dest height
buffer: Buffer; // source raw pixel buffer buffer: Buffer; // source raw pixel buffer
quality: number;
} }
/// Performs JPEG encoding. /// Performs JPEG encoding.

View File

@@ -47,6 +47,7 @@ pub struct JpegInputArgs {
pub height: u32, pub height: u32,
pub stride: u32, pub stride: u32,
pub buffer: napi::JsBuffer, pub buffer: napi::JsBuffer,
pub quality: u32,
} }
#[napi(js_name = "jpegEncode")] #[napi(js_name = "jpegEncode")]
@@ -69,7 +70,7 @@ pub fn jpeg_encode(env: Env, input: JpegInputArgs) -> napi::Result<napi::JsObjec
let vec = COMPRESSOR.with(|lazy| { let vec = COMPRESSOR.with(|lazy| {
let mut b = lazy.borrow_mut(); let mut b = lazy.borrow_mut();
b.set_quality(35); b.set_quality(input.quality);
b.set_subsamp(turbojpeg_sys::TJSAMP_TJSAMP_420); b.set_subsamp(turbojpeg_sys::TJSAMP_TJSAMP_420);
b.compress_buffer(&image) b.compress_buffer(&image)
}); });
@@ -94,6 +95,7 @@ pub struct JpegResizeInputArgs {
pub desired_width: u32, pub desired_width: u32,
pub desired_height: u32, pub desired_height: u32,
pub buffer: napi::JsBuffer, pub buffer: napi::JsBuffer,
pub quality: u32,
} }
#[napi(js_name = "jpegResizeEncode")] #[napi(js_name = "jpegResizeEncode")]
@@ -136,7 +138,7 @@ pub fn jpeg_resize_and_encode(
let vec = COMPRESSOR.with(|lazy| { let vec = COMPRESSOR.with(|lazy| {
let mut b = lazy.borrow_mut(); let mut b = lazy.borrow_mut();
b.set_quality(35); b.set_quality(input.quality);
b.set_subsamp(turbojpeg_sys::TJSAMP_TJSAMP_420); b.set_subsamp(turbojpeg_sys::TJSAMP_TJSAMP_420);
b.compress_buffer(&image) b.compress_buffer(&image)
}); });

View File

@@ -20,7 +20,8 @@ export class JPEGEncoder {
width: rect.width, width: rect.width,
height: rect.height, height: rect.height,
stride: displaySize.width, stride: displaySize.width,
buffer: canvas.subarray(offset) buffer: canvas.subarray(offset),
quality: gJpegQuality
}); });
} }
@@ -30,7 +31,8 @@ export class JPEGEncoder {
height: size.height, height: size.height,
desiredWidth: kThumbnailSize.width, desiredWidth: kThumbnailSize.width,
desiredHeight: kThumbnailSize.height, desiredHeight: kThumbnailSize.height,
buffer: buffer buffer: buffer,
quality: Math.floor(gJpegQuality / 1.5)
}); });
} }
} }