summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/fuzzy-garlics-obey.md5
-rw-r--r--packages/integrations/image/src/loaders/squoosh.ts2
-rw-r--r--packages/integrations/image/src/vendor/squoosh/image-pool.ts8
-rw-r--r--packages/integrations/image/src/vendor/squoosh/image.ts4
-rw-r--r--packages/integrations/image/src/vendor/squoosh/impl.ts12
5 files changed, 20 insertions, 11 deletions
diff --git a/.changeset/fuzzy-garlics-obey.md b/.changeset/fuzzy-garlics-obey.md
new file mode 100644
index 000000000..442c961b8
--- /dev/null
+++ b/.changeset/fuzzy-garlics-obey.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/image': patch
+---
+
+Updates the default image service to use format-specific quality defaults
diff --git a/packages/integrations/image/src/loaders/squoosh.ts b/packages/integrations/image/src/loaders/squoosh.ts
index 20529c9f8..95dda9e47 100644
--- a/packages/integrations/image/src/loaders/squoosh.ts
+++ b/packages/integrations/image/src/loaders/squoosh.ts
@@ -115,7 +115,7 @@ class SquooshService extends BaseSSRService {
inputBuffer,
operations,
transform.format,
- transform.quality || 100
+ transform.quality
);
return {
diff --git a/packages/integrations/image/src/vendor/squoosh/image-pool.ts b/packages/integrations/image/src/vendor/squoosh/image-pool.ts
index bc1b8e2bb..d29245fb4 100644
--- a/packages/integrations/image/src/vendor/squoosh/image-pool.ts
+++ b/packages/integrations/image/src/vendor/squoosh/image-pool.ts
@@ -78,7 +78,7 @@ export async function processBuffer(
buffer: Buffer,
operations: Operation[],
encoding: OutputFormat,
- quality: number
+ quality?: number
): Promise<Uint8Array> {
// @ts-ignore
const worker = await getWorker()
@@ -109,14 +109,14 @@ export async function processBuffer(
return await worker.dispatchJob({
operation: 'encodeavif',
imageData,
- quality: quality || 100
+ quality,
}) as Uint8Array;
case 'jpeg':
case 'jpg':
return await worker.dispatchJob({
operation: 'encodejpeg',
imageData,
- quality: quality || 100,
+ quality,
}) as Uint8Array;
case 'png':
return await worker.dispatchJob({
@@ -127,7 +127,7 @@ export async function processBuffer(
return await worker.dispatchJob({
operation: 'encodewebp',
imageData,
- quality: quality || 100,
+ quality,
}) as Uint8Array;
default:
throw Error(`Unsupported encoding format`)
diff --git a/packages/integrations/image/src/vendor/squoosh/image.ts b/packages/integrations/image/src/vendor/squoosh/image.ts
index fa77efd97..aad4fb598 100644
--- a/packages/integrations/image/src/vendor/squoosh/image.ts
+++ b/packages/integrations/image/src/vendor/squoosh/image.ts
@@ -16,7 +16,7 @@ export async function processBuffer(
buffer: Buffer,
operations: Operation[],
encoding: OutputFormat,
- quality: number
+ quality?: number
): Promise<Uint8Array> {
let imageData = await impl.decodeBuffer(buffer)
for (const operation of operations) {
@@ -29,7 +29,7 @@ export async function processBuffer(
switch (encoding) {
case 'avif':
- return await impl.encodeAvif(imageData, { quality: quality }) as Uint8Array;
+ return await impl.encodeAvif(imageData, { quality }) as Uint8Array;
case 'jpeg':
case 'jpg':
return await impl.encodeJpeg(imageData, { quality }) as Uint8Array;
diff --git a/packages/integrations/image/src/vendor/squoosh/impl.ts b/packages/integrations/image/src/vendor/squoosh/impl.ts
index 722336807..fa50c0fd9 100644
--- a/packages/integrations/image/src/vendor/squoosh/impl.ts
+++ b/packages/integrations/image/src/vendor/squoosh/impl.ts
@@ -71,13 +71,14 @@ export async function resize({ image, width, height }: ResizeOpts) {
export async function encodeJpeg(
image: ImageData,
- { quality }: { quality: number }
+ opts: { quality?: number }
): Promise<Uint8Array> {
image = ImageData.from(image)
-
+
const e = supportedFormats['mozjpeg']
const m = await e.enc()
await maybeDelay()
+ const quality = opts.quality || e.defaultEncoderOptions.quality
const r = await m.encode(image.data, image.width, image.height, {
...e.defaultEncoderOptions,
quality,
@@ -87,13 +88,14 @@ export async function encodeJpeg(
export async function encodeWebp(
image: ImageData,
- { quality }: { quality: number }
+ opts: { quality?: number }
): Promise<Uint8Array> {
image = ImageData.from(image)
const e = supportedFormats['webp']
const m = await e.enc()
await maybeDelay()
+ const quality = opts.quality || e.defaultEncoderOptions.quality
const r = await m.encode(image.data, image.width, image.height, {
...e.defaultEncoderOptions,
quality,
@@ -103,7 +105,7 @@ export async function encodeWebp(
export async function encodeAvif(
image: ImageData,
- { quality }: { quality: number }
+ opts: { quality?: number }
): Promise<Uint8Array> {
image = ImageData.from(image)
@@ -111,6 +113,8 @@ export async function encodeAvif(
const m = await e.enc()
await maybeDelay()
const val = e.autoOptimize.min
+ // AVIF doesn't use a 0-100 quality, default to 75 and convert to cqLevel below
+ const quality = opts.quality || 75
const r = await m.encode(image.data, image.width, image.height, {
...e.defaultEncoderOptions,
// Think of cqLevel as the "amount" of quantization (0 to 62),