You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.6 KiB
69 lines
1.6 KiB
// universal pixel data getter
|
|
|
|
'use strict'
|
|
|
|
var imgType = require('image-type')
|
|
var tostr = require('arraybuffer-to-string')
|
|
var cache = require('./cache')
|
|
|
|
var canvas, context
|
|
|
|
module.exports = function readRaw(img, o) {
|
|
var width = o.shape[0], height = o.shape[1]
|
|
var clip = o.clip
|
|
var type = o.type
|
|
|
|
if (!canvas) {
|
|
canvas = document.createElement('canvas')
|
|
context = canvas.getContext('2d')
|
|
}
|
|
canvas.width = width
|
|
canvas.height = height
|
|
|
|
if (img instanceof Uint8Array || img instanceof Uint8ClampedArray) {
|
|
// decode encoded data
|
|
|
|
if (!type) {
|
|
type = imgType(img)
|
|
type = type && type.mime
|
|
}
|
|
|
|
if (type) {
|
|
var src = img
|
|
return new Promise(function (ok, nok) {
|
|
var img = new Image()
|
|
img.crossOrigin = 'Anonymous'
|
|
img.onload = function() {
|
|
if (!o.shape[0]) o.shape[0] = img.width
|
|
if (!o.shape[1]) o.shape[1] = img.height
|
|
ok(readRaw(img, o))
|
|
}
|
|
img.onerror = function(err) {
|
|
nok(err)
|
|
}
|
|
img.src = ['data:' + type, 'base64,' + tostr(src, 'base64')].join(';')
|
|
})
|
|
}
|
|
|
|
// raw data
|
|
if (!width || !height) throw new Error('Raw data requires options.width and options.height')
|
|
var rawData = context.createImageData(width, height)
|
|
rawData.data.set(img)
|
|
context.putImageData(rawData, 0, 0)
|
|
}
|
|
// default img-like object
|
|
else {
|
|
context.drawImage(img, 0, 0)
|
|
}
|
|
|
|
var result
|
|
|
|
if (o.cache) {
|
|
result = context.getImageData(0, 0, width, height)
|
|
cache.set(o.cache, result)
|
|
}
|
|
|
|
result = context.getImageData(clip.x, clip.y, clip.width || width, clip.height || height)
|
|
|
|
return Promise.resolve(result)
|
|
}
|
|
|