k-l-lambda's picture
feat: add Python ML services (CPU mode) with model download
2b7aae2
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 };