import { createElementNS } from '../utils.js'; import { SRGBToLinear } from '../math/Color.js'; let _canvas; class ImageUtils { static getDataURL(image) { if (/^data:/i.test(image.src)) { return image.src; } if (typeof HTMLCanvasElement == 'undefined') { return image.src; } let canvas; if (image instanceof HTMLCanvasElement) { canvas = image; } else { if (_canvas === undefined) _canvas = createElementNS('canvas'); _canvas.width = image.width; _canvas.height = image.height; const context = _canvas.getContext('2d'); if (image instanceof ImageData) { context.putImageData(image, 0, 0); } else { context.drawImage(image, 0, 0, image.width, image.height); } canvas = _canvas; } if (canvas.width > 2048 || canvas.height > 2048) { console.warn('THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image); return canvas.toDataURL('image/jpeg', 0.6); } else { return canvas.toDataURL('image/png'); } } static sRGBToLinear(image) { if ( (typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement) || (typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap) ) { const canvas = createElementNS('canvas'); canvas.width = image.width; canvas.height = image.height; const context = canvas.getContext('2d'); context.drawImage(image, 0, 0, image.width, image.height); const imageData = context.getImageData(0, 0, image.width, image.height); const data = imageData.data; for (let i = 0; i < data.length; i++) { data[i] = SRGBToLinear(data[i] / 255) * 255; } context.putImageData(imageData, 0, 0); return canvas; } else if (image.data) { const data = image.data.slice(0); for (let i = 0; i < data.length; i++) { if (data instanceof Uint8Array || data instanceof Uint8ClampedArray) { data[i] = Math.floor(SRGBToLinear(data[i] / 255) * 255); } else { // assuming float data[i] = SRGBToLinear(data[i]); } } return { data: data, width: image.width, height: image.height, }; } else { console.warn('THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.'); return image; } } } export { ImageUtils };