import type { ImageConverter, ImageDataLike } from '../image.js'; import { MIME_PNG } from '../image.js'; const imageConverter = { /** * Create ImageData from an image buffer. * * @param arrayBuffer - Image buffer to decode. * @returns Decoded image data. * @private */ // eslint-disable-next-line max-statements async decode (arrayBuffer: Readonly): Promise { const blob = new Blob([arrayBuffer]); const bitmap = await createImageBitmap(blob); try { const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); const ctx = canvas.getContext('2d'); if (!ctx) { throw new Error('canvas 2D context is not available'); } ctx.drawImage(bitmap, 0, 0); const { data } = ctx.getImageData(0, 0, bitmap.width, bitmap.height); return { data, height: bitmap.height, width: bitmap.width }; } finally { bitmap.close(); } }, /** * Create an image buffer from ImageData. * * @param image - Image data to encode. * @param mime - Output MIME type. * @returns Encoded image buffer. * @private */ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types async encode (image: ImageDataLike, mime: string = MIME_PNG): Promise { const canvas = new OffscreenCanvas(image.width, image.height); const ctx = canvas.getContext('2d'); if (!ctx) { throw new Error('canvas 2D context is not available'); } const imageData = new ImageData(new Uint8ClampedArray(image.data), image.width, image.height); ctx.putImageData(imageData, 0, 0); const blob = await canvas.convertToBlob({ type: mime }); return await blob.arrayBuffer(); } } as const satisfies ImageConverter; export { imageConverter }; export default imageConverter;