/** * Converts an array of bytes into an image data object * ready to be used with a canvas context. * * @param buffer The array of bytes to convert. * @param width The width of the image in the buffer. * @returns The resulting image data object. */ export const bufferToImageData = ( buffer: Uint8Array, width: number ): ImageData => { const clampedBuffer = new Uint8ClampedArray(buffer.length); for (let index = 0; index < clampedBuffer.length; index += 4) { clampedBuffer[index + 0] = buffer[index]; clampedBuffer[index + 1] = buffer[index + 1]; clampedBuffer[index + 2] = buffer[index + 2]; clampedBuffer[index + 3] = buffer[index + 3]; } return new ImageData(clampedBuffer, width); }; /** * Converts the provided array of bytes containing an image * data into a data URL ready to be used in an <img> tag. * * @param buffer The array of bytes containing the image data. * @param width The width of the image in the buffer. * @param format The format of the image as a MIME string. * @returns The resulting data URL. */ export const bufferToDataUrl = ( buffer: Uint8Array, width: number, format = "image/png" ): string => { const imageData = bufferToImageData(buffer, width); const canvas = document.createElement("canvas"); [canvas.width, canvas.height] = [imageData.width, imageData.height]; const context = canvas.getContext("2d"); context?.putImageData(imageData, 0, 0); const dataUrl = canvas.toDataURL(format); return dataUrl; };