diff --git a/README.md b/README.md
index d895288..115b28b 100644
--- a/README.md
+++ b/README.md
@@ -89,16 +89,16 @@ You can clone this repo and run the following command to taste the example below
- `yarn install`
- `node example.mjs`
-| Optimization | Raw | Raw Size | Optimized Size |
-| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------- |
-| `losslessCompressPng()`
**Lossless** |
[CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `736K` |
-| `pngQuantize({ maxQuality: 75 })`
**Lossy** |
[CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `248K` |
-| `compressJpeg()`
**Lossless** |
| `192K` | `184K` |
-| `compressJpeg(75)`
**Lossy** |
| `192K` | `104K` |
-| `new Transformer(PNG).webpLossless()`
**Lossless** |
[CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `588K` |
-| `new Transformer(PNG).webp(75)`
**Lossy** |
[CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `64K` |
-| `Transformer(PNG).avif({ quality: 100 })`
**Lossless** |
[CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `536K` |
-| `new Transformer(PNG).avif({ quality: 75, chromaSubsampling: ChromaSubsampling.Yuv420 })`
**Lossy** |
[CC-BY-SA 3.0](https://creativecommons.org/licenses/by/3.0) by [Niabot](https://commons.wikimedia.org/wiki/User:Niabot) | `888K` | `64K` |
+| Optimization | Raw | Raw Size | Optimized Size |
+| ------------------------------------------------------------------------------------------------------- | -------------------------------------------- | -------- | -------------- |
+| `losslessCompressPng()`
**Lossless** |
| `1.2M` | `876K` |
+| `pngQuantize({ maxQuality: 75 })`
**Lossy** |
| `1.2M` | `228K` |
+| `compressJpeg()`
**Lossless** |
| `192K` | `184K` |
+| `compressJpeg(75)`
**Lossy** |
| `192K` | `104K` |
+| `new Transformer(PNG).webpLossless()`
**Lossless** |
| `1.2M` | `676K` |
+| `new Transformer(PNG).webp(75)`
**Lossy** |
| `1.2M` | `84K` |
+| `Transformer(PNG).avif({ quality: 100 })`
**Lossless** |
| `1.2M` | `584K` |
+| `new Transformer(PNG).avif({ quality: 75, chromaSubsampling: ChromaSubsampling.Yuv420 })`
**Lossy** |
| `1.2M` | `112K` |
```js
import { readFileSync, writeFileSync } from 'fs'
diff --git a/package.json b/package.json
index 990ab8c..09f8f97 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
"website"
],
"devDependencies": {
- "@napi-rs/cli": "^3.0.0-alpha.38",
+ "@napi-rs/cli": "^3.0.0-alpha.40",
"@taplo/cli": "^0.7.0",
"@types/node": "^20.11.16",
"@types/sharp": "^0.31.1",
diff --git a/packages/binding/Cargo.toml b/packages/binding/Cargo.toml
index a2309f4..f51a599 100644
--- a/packages/binding/Cargo.toml
+++ b/packages/binding/Cargo.toml
@@ -35,6 +35,9 @@ image = { version = "0.24", default-features = false, features = [
"openexr",
] }
jpeg-decoder = "0.3"
+libavif = { version = "0.13", default-features = false, features = [
+ "codec-aom",
+] }
libc = "0.2"
lodepng = "3"
napi = { version = "2", default-features = false, features = ["napi3"] }
@@ -64,15 +67,5 @@ libwebp-sys = { version = "0.9", default-features = false, features = ["std", "p
[target.'cfg(all(target_os = "macos", target_arch = "x86_64"))'.dependencies]
libwebp-sys = { version = "0.9", default-features = false, features = ["std", "parallel"] }
-[target.'cfg(target_family = "wasm")'.dependencies]
-libavif = { git="https://github.com/njaard/libavif-rs.git", rev = "678bd68", version = "0.12", default-features = false, features = [
- "codec-rav1e",
-] }
-
-[target.'cfg(not(target_family = "wasm"))'.dependencies]
-libavif = { git="https://github.com/njaard/libavif-rs.git", rev = "678bd68", version = "0.12", default-features = false, features = [
- "codec-aom",
-] }
-
[build-dependencies]
napi-build = "2"
diff --git a/packages/binding/__test__/optimize.spec.mjs b/packages/binding/__test__/optimize.spec.mjs
index 2e2c7fe..1560191 100644
--- a/packages/binding/__test__/optimize.spec.mjs
+++ b/packages/binding/__test__/optimize.spec.mjs
@@ -8,7 +8,7 @@ import { losslessCompressPng, pngQuantize, compressJpeg, Transformer } from '../
const ROOT_DIR = join(fileURLToPath(import.meta.url), '..', '..', '..', '..')
-const PNG = await fs.readFile(join(ROOT_DIR, 'nasa-4928x3279.png'))
+const PNG = await fs.readFile(join(ROOT_DIR, 'un-optimized.png'))
const JPEG = await fs.readFile(join(ROOT_DIR, 'un-optimized.jpg'))
test('should be able to lossless optimize png image', async (t) => {
@@ -21,7 +21,11 @@ test('should be able to lossless optimize png image', async (t) => {
})
test('should be able to lossy optimize png image', async (t) => {
- const dest = await pngQuantize(PNG, { speed: 10 })
+ if (process.env.NAPI_RS_FORCE_WASI) {
+ t.pass()
+ return
+ }
+ const dest = await pngQuantize(PNG, { speed: 5, maxQuality: 1, minQuality: 1 })
t.true(dest.length < PNG.length)
})
@@ -49,9 +53,15 @@ test('should be able to lossless encode webp from jpeg', (t) => {
})
test('should be able to encode avif from png', (t) => {
- t.true(new Transformer(PNG).avifSync().length < PNG.length)
+ t.true(new Transformer(PNG).avifSync({
+ speed: 10,
+ threads: 4,
+ }).length < PNG.length)
})
test('should be able to encode avif from jpeg', (t) => {
- t.true(new Transformer(JPEG).avifSync().length < JPEG.length)
+ t.true(new Transformer(JPEG).avifSync({
+ speed: 10,
+ threads: 4,
+ }).length < JPEG.length)
})
diff --git a/packages/binding/__test__/transformer.spec.mjs b/packages/binding/__test__/transformer.spec.mjs
index f3c64cd..fe2e7a1 100644
--- a/packages/binding/__test__/transformer.spec.mjs
+++ b/packages/binding/__test__/transformer.spec.mjs
@@ -18,8 +18,8 @@ const SVG = await fs.readFile(join(ROOT_DIR, 'input-debian.svg'))
test('should be able to get metadata from png', async (t) => {
const decoder = new Transformer(PNG)
const metadata = await decoder.metadata()
- t.is(metadata.width, 1052)
- t.is(metadata.height, 744)
+ t.is(metadata.width, 1024)
+ t.is(metadata.height, 681)
})
test('should be able to get metadata from jpg', async (t) => {
diff --git a/packages/binding/build.rs b/packages/binding/build.rs
index 1f866b6..bbfc9e4 100644
--- a/packages/binding/build.rs
+++ b/packages/binding/build.rs
@@ -1,5 +1,3 @@
-extern crate napi_build;
-
fn main() {
napi_build::setup();
}
diff --git a/packages/binding/package.json b/packages/binding/package.json
index b1d9c33..fd0b2e8 100644
--- a/packages/binding/package.json
+++ b/packages/binding/package.json
@@ -64,7 +64,7 @@
},
"repository": "git@github.com:Brooooooklyn/Image.git",
"devDependencies": {
- "@napi-rs/cli": "^3.0.0-alpha.38",
+ "@napi-rs/cli": "^3.0.0-alpha.40",
"@napi-rs/wasm-runtime": "^0.1.1"
}
}
diff --git a/packages/binding/src/avif.rs b/packages/binding/src/avif.rs
index 060402b..7b9bbe4 100644
--- a/packages/binding/src/avif.rs
+++ b/packages/binding/src/avif.rs
@@ -102,8 +102,8 @@ pub(crate) fn encode_avif_inner(
) -> Result> {
let mut encoder = libavif::Encoder::new();
let config: Config = config.unwrap_or_default().into();
- encoder.set_quality((63.0 * (1.0 - config.quality as f32 / 100.0)) as u8);
- encoder.set_alpha_quality((63.0 * (1.0 - config.alpha_quality as f32 / 100.0)) as u8);
+ encoder.set_quality(config.quality);
+ encoder.set_alpha_quality(config.alpha_quality);
encoder.set_speed(config.speed);
encoder.set_max_threads(config.threads);
let (width, height) = input_image.dimensions();
diff --git a/packages/binding/src/transformer.rs b/packages/binding/src/transformer.rs
index 85d8a7c..9d1dfb0 100644
--- a/packages/binding/src/transformer.rs
+++ b/packages/binding/src/transformer.rs
@@ -565,6 +565,15 @@ impl Task for EncodeTask {
color_type,
)
}?;
+ if output_buf.is_null() {
+ return Err(Error::new(
+ Status::GenericFailure,
+ format!(
+ "Encode lossless webp failed, {}",
+ dynamic_image.as_bytes().len()
+ ),
+ ));
+ }
return Ok(EncodeOutput::Raw(output_buf, size));
}
EncodeOptions::Avif(ref options) => {
diff --git a/un-optimized.png b/un-optimized.png
index 35eeb58..a03aa4a 100644
Binary files a/un-optimized.png and b/un-optimized.png differ
diff --git a/website/og-image.js b/website/og-image.js
index 841f5c6..99fe3a7 100644
--- a/website/og-image.js
+++ b/website/og-image.js
@@ -25,138 +25,144 @@ const Title = '@napi-rs/image'
ctx.fillText(Title, 80, 100)
const Arrow = new Image()
-Arrow.src = Buffer.from(`
-