配置项如下
var uploadedDataURL = "/asset/get/s/data-1503306613861-ByR_mXudZ.png";
xDotCnt = 32;
yDotCnt = 32;
option = {
grid: {
width: 400,
height: 400,
left: 200
},
xAxis: {
min: 0,
max: xDotCnt - 1,
type: 'value',
show: false
},
yAxis: {
min: 0,
max: yDotCnt - 1,
type: 'value',
inverse: true,
show: false
},
series: [],
title: {
text: '散点图像素画'
},
animationDuration: function(id) {
return (id * 2 + Math.random() * 100 + 3) * 5;
},
animationDelay: function(id) {
return (Math.random() * 1000) * 5;
}
};
getPixels(uploadedDataURL, setOption);
var btn = document.createElement('button');
btn.style.position = 'absolute';
btn.style.top = '50px';
btn.style.marginLeft = '10px';
btn.innerHTML = '上传图片';
btn.setAttribute('onclick', 'upload()');
document.body.appendChild(btn);
var file = document.createElement('input');
file.style.display = 'none';
file.setAttribute('type', 'file');
file.setAttribute('onchange', 'imageSelected(this.files)');
window.upload = function () {
file.click();
};
window.imageSelected = function (files) {
if (files && files.length > 0) {
var reader = new FileReader();
reader.onload = function(e) {
getPixels(e.target.result, setOption);
};
reader.readAsDataURL(files[0]);
}
};
function setOption(pixels) {
var series = {
type: 'scatter',
symbol: 'circle',
symbolSize: [12, 12],
data: []
};
for (var i = 0, x = 0, y = 0, len = pixels.length; i < len; ++i) {
if (pixels[i] && pixels[i] !== '-') {
series.data.push({
value: [y, x],
itemStyle: {
normal: {
color: pixels[i]
}
}
});
}
++x;
if (x === xDotCnt) {
// Next line
++y;
x = 0;
}
}
option.series = series;
myChart.setOption(option, true);
}
function getPixels(url, cb) {
var canvasRatio = 1;
var canvas = document.createElement('canvas');
canvas.width = xDotCnt * canvasRatio;
canvas.height = yDotCnt * canvasRatio;
var ctx = canvas.getContext('2d');
var img = new Image();
img.onload = function () {
var x = 0;
var y = 0;
var width = canvas.width;
var height = canvas.height;
if (img.width > img.height) {
y = (img.width - img.height) / 2
/ img.width * canvas.width;
height = img.height / img.width * canvas.width;
}
else if (img.width < img.height) {
x = (img.height - img.width) / 2
/ img.height * canvas.height;
width = img.width / img.height * canvas.height;
}
ctx.drawImage(img, x, y, width, height);
var pixels = [];
for (var x = 0; x < xDotCnt; ++x) {
for (var y = 0; y < yDotCnt; ++y) {
var data = ctx.getImageData(
x * canvasRatio, y * canvasRatio, 1, 1
).data;
pixels.push(getHex(data[0], data[1], data[2], data[3]));
}
}
if (typeof cb === 'function') {
cb(pixels);
}
};
img.src = url;
}
function getHex(r, g, b, a) {
if (a === 0) {
return '-';
}
else {
var color = [r, g, b];
var hex = '#';
for (var c = 0; c < color.length; ++c) {
var d = color[c].toString(16);
if (d.length < 2) {
d = '0' + d;
}
hex += d;
}
return hex;
}
}