import * as util from './utils.js' import DataSet from './DataSet.js' // See TileData.js for several rgbToData functions // as well as their use with several tile servers /** * Class for converting an image to a DataSet. * * @class * @extends DataSet */ class RGBDataSet extends DataSet { /** * Convert an r,g,b triple into an integer * @param {number} r Red value, integer in [0,255] * @param {number} g Green value, integer in [0,255] * @param {number} b Blue value, integer in [0,255] * @returns {number} A 24 bit integer */ static rgbToInt24(r, g, b) { return r * 256 * 256 + g * 256 + b } /** * As above with min/scale * @param {number} min The min return value * @param {number} scale The scale factor * @returns {number} A 24 bit integer */ static rgbScaleFunction(min, scale) { return (r, g, b) => min + rgbToInt24(r, g, b) * scale // return (r, g, b) => min + (r * 256 * 256 + g * 256 + b) * scale } // Constructor args: (img, rgbToData, ArrayType) // where rgbToData(r,g,b) returns a number for the dataset. /** * Create a {@link DataSet} from image pixel data * @param {Image} img Any "imagable" object that can be drawn to a canvas * @param {function} rgbToData Fnction converting 3 r,g,b bytes to a number * @param {constructor} ArrayType A TypedArray or Array. (default Float32) */ constructor( img, rgbToData = RGBDataSet.rgbToInt24, ArrayType = Float32Array ) { // const [width, height] = util.imageSize(img) const { width, height } = img super(width, height, new ArrayType(width * height)) // super(img.width, img.height, new ArrayType(img.width * img.height)) // Not used or defined anywhere! // if (Array.isArray(rgbToData)) // rgbToData = RGBDataSet.newRgbDataFunction(rgbToData) // const ctx = util.createCtx(img.width, img.height) // util.fillCtxWithImage(ctx, img) const ctx = util.imageToCtx(img) const imgData = util.ctxImageData(ctx) const convertedData = this.data for (var i = 0; i < convertedData.length; i++) { const r = imgData.data[4 * i] const g = imgData.data[4 * i + 1] const b = imgData.data[4 * i + 2] convertedData[i] = rgbToData(r, g, b) } } } export default RGBDataSet