Use oxipng raw api

This commit is contained in:
Andrew
2024-03-16 19:05:50 +13:00
parent df7b622413
commit 42ef430cee
3 changed files with 21 additions and 9 deletions

View File

@@ -1,11 +1,18 @@
#[cfg(feature = "parallel")]
pub use wasm_bindgen_rayon::init_thread_pool;
use oxipng::Interlacing;
use oxipng::{BitDepth, ColorType, Interlacing};
use wasm_bindgen::prelude::*;
use wasm_bindgen::Clamped;
#[wasm_bindgen]
pub fn optimise(data: &[u8], level: u8, interlace: bool) -> Vec<u8> {
pub fn optimise(
data: Clamped<Vec<u8>>,
width: u32,
height: u32,
level: u8,
interlace: bool,
) -> Vec<u8> {
let mut options = oxipng::Options::from_preset(level);
options.optimize_alpha = true;
options.interlace = Some(if interlace {
@@ -14,5 +21,7 @@ pub fn optimise(data: &[u8], level: u8, interlace: bool) -> Vec<u8> {
Interlacing::None
});
oxipng::optimize_from_memory(data, &options).unwrap_throw()
let raw = oxipng::RawImage::new(width, height, ColorType::RGBA, BitDepth::Eight, data.0)
.unwrap_throw();
raw.create_optimized_png(&options).unwrap_throw()
}

View File

@@ -18,9 +18,7 @@ export async function encode(
imageData: ImageData,
options: EncodeOptions,
) {
const pngBlob = await abortable(signal, canvasEncode(imageData, 'image/png'));
const pngBuffer = await abortable(signal, blobToArrayBuffer(pngBlob));
return workerBridge.oxipngEncode(signal, pngBuffer, options);
return workerBridge.oxipngEncode(signal, imageData, options);
}
type Props = {

View File

@@ -35,7 +35,7 @@ async function initST() {
let wasmReady: ReturnType<typeof initMT | typeof initST>;
export default async function encode(
data: ArrayBuffer,
data: ImageData,
options: EncodeOptions,
): Promise<ArrayBuffer> {
if (!wasmReady) {
@@ -45,6 +45,11 @@ export default async function encode(
}
const optimise = await wasmReady;
return optimise(new Uint8Array(data), options.level, options.interlace)
.buffer;
return optimise(
data.data,
data.width,
data.height,
options.level,
options.interlace,
).buffer;
}