Spaces:
Running
Running
| 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 }; | |