Skip to content

Commit 23a1a21

Browse files
Merge upstream develop
2 parents abee49c + 5fc5513 commit 23a1a21

5 files changed

Lines changed: 35 additions & 0 deletions

File tree

packages/rs-core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ rand = "0.8"
1717
polycentric-common = { path = "../rs-common" }
1818
getrandom = { version = "0.2", features = ["js"] }
1919
sha2 = "0.10"
20+
image = "0.25.10"
2021

2122
# FFI
2223
libc = { version = "0.2.172", optional = true }

packages/rs-core/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pub mod client;
22
pub mod event;
3+
pub mod media;
34
pub mod platform;
45
pub mod store;

packages/rs-core/src/media/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod process_image;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use image::codecs::jpeg::JpegEncoder;
2+
use image::imageops::FilterType;
3+
use image::{ImageError, ImageReader};
4+
use std::io::Cursor;
5+
6+
const JPEG_QUALITY: u8 = 95;
7+
8+
pub fn process_image(image: &[u8], width: u32, height: u32) -> Result<Vec<u8>, ImageError> {
9+
let src = ImageReader::new(Cursor::new(image))
10+
.with_guessed_format()
11+
.unwrap();
12+
let img = src.decode()?;
13+
let resized = img.resize_to_fill(width, height, FilterType::Lanczos3);
14+
let mut buf: Vec<u8> = Vec::new();
15+
let encoder = JpegEncoder::new_with_quality(&mut buf, JPEG_QUALITY);
16+
resized.write_with_encoder(encoder)?;
17+
Ok(buf)
18+
}

packages/rs-core/src/platform/wasm.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,20 @@ impl PolycentricWasm {
384384

385385
Ok(Uint8Array::from(&response.encode_to_vec()[..]))
386386
}
387+
388+
/// Decode `image` bytes, resize to fill `width` x `height` preserving
389+
/// aspect ratio (center-cropped), and encode as JPEG.
390+
#[wasm_bindgen]
391+
pub fn process_image_to_jpeg(
392+
&self,
393+
image: &[u8],
394+
width: u32,
395+
height: u32,
396+
) -> std::result::Result<Uint8Array, JsValue> {
397+
let jpeg = crate::media::process_image::process_image(image, width, height)
398+
.map_err(|e| JsValue::from_str(&format!("process_image failed: {e}")))?;
399+
Ok(Uint8Array::from(&jpeg[..]))
400+
}
387401
}
388402

389403
impl PolycentricWasm {

0 commit comments

Comments
 (0)