UNPKG

@paroicms/server-image-cache-engine

Version:

The image variant engine that we use at Paroi.

100 lines 3.05 kB
import sharp from "sharp"; import { sharpQueue } from "./image-processor-setup.js"; import { convertSharpFormatToMediaType } from "./internal/resizer.js"; const drawPixelByChannels = { 1: drawPixel1Channel, 2: drawPixel2Channels, 3: drawPixel3Channels, 4: drawPixel4Channels, }; export async function createDefaultAdminFavicon(binaryFile) { const sharpInst = sharp(binaryFile); const metadata = await sharpQueue(() => sharpInst.metadata()); if (metadata.width === undefined || metadata.height === undefined) { throw new Error("cannot get image size"); } const dim = Math.min(metadata.width, metadata.height, 128); const { data, info } = await sharpQueue(() => sharpInst .resize({ width: dim, height: dim, fit: "cover", }) .ensureAlpha() .raw() .toBuffer({ resolveWithObject: true })); const { width, height, channels } = info; const drawPixel = drawPixelByChannels[channels]; drawThePattern({ data, drawPixel, width: dim, channels }); const result = await sharpQueue(() => sharp(data, { raw: { width, height, channels } }) .webp({ lossless: true, }) .toBuffer({ resolveWithObject: true })); const mediaType = convertSharpFormatToMediaType(result.info.format); return { rawWidth: result.info.width, rawHeight: result.info.height, weightB: result.data.byteLength, mediaType, lossless: mediaType === "image/png" || mediaType === "image/webp", binaryFile: result.data, }; } function drawThePattern({ data, drawPixel, width, channels, }) { const minX = Math.trunc(width * 0.05); let maxX = Math.trunc(width * 0.45); let w = maxX - minX; if (w <= 0) return; if (w % 2 === 1) { // ensure even width ++w; ++maxX; if (maxX >= width) return; } const minY = minX; // it's a square const maxY = maxX; const startX = minX + w / 2 - 1; let curX = startX; let curEndX = curX + 2; let inc = true; for (let y = minY; y < maxY; ++y) { for (let x = curX; x < curEndX; ++x) { const index = (y * width + x) * channels; drawPixel(data, index); } if (inc) { --curX; ++curEndX; if (curX <= minX || curEndX >= maxX) { inc = false; } } else { ++curX; --curEndX; if (curX > startX) { break; } } } } function drawPixel1Channel(data, index) { data[index] = 200; } function drawPixel2Channels(data, index) { drawPixel1Channel(data, index); data[index + 1] = 255; } function drawPixel3Channels(data, index) { data[index] = 240; data[index + 1] = 60; data[index + 2] = 60; } function drawPixel4Channels(data, index) { drawPixel3Channels(data, index); data[index + 3] = 255; } //# sourceMappingURL=default-admin-ui-favicon.js.map