162 lines
4.9 KiB
JavaScript
162 lines
4.9 KiB
JavaScript
// Generated by CoffeeScript 2.7.0
|
|
(function() {
|
|
var $, autoRefresh, canvas, dataURItoBlob, drawText, file, generateFileName, graph, image, input, inputItems, makeStyle, readFile, redraw, refresh, textCtx;
|
|
|
|
$ = function(sel) {
|
|
return document.querySelector(sel);
|
|
};
|
|
|
|
inputItems = ['text', 'color', 'alpha', 'angle', 'space', 'size'];
|
|
|
|
input = {};
|
|
|
|
image = $('#image');
|
|
|
|
graph = $('#graph');
|
|
|
|
refresh = $('#refresh');
|
|
|
|
autoRefresh = $('#auto-refresh');
|
|
|
|
file = null;
|
|
|
|
canvas = null;
|
|
|
|
textCtx = null;
|
|
|
|
redraw = null;
|
|
|
|
dataURItoBlob = function(dataURI) {
|
|
var arr, binStr, i, k, len, ref;
|
|
binStr = atob((dataURI.split(','))[1]);
|
|
len = binStr.length;
|
|
arr = new Uint8Array(len);
|
|
for (i = k = 0, ref = len - 1; (0 <= ref ? k <= ref : k >= ref); i = 0 <= ref ? ++k : --k) {
|
|
arr[i] = binStr.charCodeAt(i);
|
|
}
|
|
return new Blob([arr], {
|
|
type: 'image/png'
|
|
});
|
|
};
|
|
|
|
generateFileName = function() {
|
|
var d, pad;
|
|
pad = function(n) {
|
|
if (n < 10) {
|
|
return '0' + n;
|
|
} else {
|
|
return n;
|
|
}
|
|
};
|
|
d = new Date();
|
|
return '' + d.getFullYear() + '-' + (pad(d.getMonth() + 1)) + '-' + (pad(d.getDate())) + ' ' + (pad(d.getHours())) + (pad(d.getMinutes())) + (pad(d.getSeconds())) + '.png';
|
|
};
|
|
|
|
readFile = function() {
|
|
var fileReader;
|
|
if (file == null) {
|
|
return;
|
|
}
|
|
fileReader = new FileReader();
|
|
fileReader.onload = function() {
|
|
var img;
|
|
img = new Image();
|
|
img.onload = function() {
|
|
var ctx;
|
|
canvas = document.createElement('canvas');
|
|
canvas.width = img.width;
|
|
canvas.height = img.height;
|
|
textCtx = null;
|
|
ctx = canvas.getContext('2d');
|
|
ctx.drawImage(img, 0, 0);
|
|
redraw = function() {
|
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
return ctx.drawImage(img, 0, 0);
|
|
};
|
|
drawText();
|
|
graph.innerHTML = '';
|
|
graph.appendChild(canvas);
|
|
return canvas.addEventListener('click', function() {
|
|
var blob, imageData, link;
|
|
link = document.createElement('a');
|
|
link.download = generateFileName();
|
|
imageData = canvas.toDataURL('image/png');
|
|
blob = dataURItoBlob(imageData);
|
|
link.href = URL.createObjectURL(blob);
|
|
graph.appendChild(link);
|
|
return setTimeout(function() {
|
|
link.click();
|
|
return graph.removeChild(link);
|
|
}, 100);
|
|
});
|
|
};
|
|
return img.src = fileReader.result;
|
|
};
|
|
return fileReader.readAsDataURL(file);
|
|
};
|
|
|
|
makeStyle = function() {
|
|
var match;
|
|
match = input.color.value.match(/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i);
|
|
return 'rgba(' + (parseInt(match[1], 16)) + ',' + (parseInt(match[2], 16)) + ',' + (parseInt(match[3], 16)) + ',' + input.alpha.value + ')';
|
|
};
|
|
|
|
drawText = function() {
|
|
var i, j, k, l, margin, ref, ref1, ref2, ref3, step, textSize, width, x, y;
|
|
if (canvas == null) {
|
|
return;
|
|
}
|
|
textSize = input.size.value * Math.max(15, (Math.min(canvas.width, canvas.height)) / 25);
|
|
if (textCtx != null) {
|
|
redraw();
|
|
} else {
|
|
textCtx = canvas.getContext('2d');
|
|
}
|
|
textCtx.save();
|
|
textCtx.translate(canvas.width / 2, canvas.height / 2);
|
|
textCtx.rotate(input.angle.value * Math.PI / 180);
|
|
textCtx.fillStyle = makeStyle();
|
|
textCtx.font = 'bold ' + textSize + 'px -apple-system,"Helvetica Neue",Helvetica,Arial,"PingFang SC","Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif';
|
|
width = (textCtx.measureText(input.text.value)).width;
|
|
step = Math.sqrt((Math.pow(canvas.width, 2)) + (Math.pow(canvas.height, 2)));
|
|
margin = (textCtx.measureText('啊')).width;
|
|
x = Math.ceil(step / (width + margin));
|
|
y = Math.ceil((step / (input.space.value * textSize)) / 2);
|
|
for (i = k = ref = -x, ref1 = x; (ref <= ref1 ? k <= ref1 : k >= ref1); i = ref <= ref1 ? ++k : --k) {
|
|
for (j = l = ref2 = -y, ref3 = y; (ref2 <= ref3 ? l <= ref3 : l >= ref3); j = ref2 <= ref3 ? ++l : --l) {
|
|
textCtx.fillText(input.text.value, (width + margin) * i, input.space.value * textSize * j);
|
|
}
|
|
}
|
|
textCtx.restore();
|
|
};
|
|
|
|
image.addEventListener('change', function() {
|
|
var ref;
|
|
file = this.files[0];
|
|
if ((ref = file.type) !== 'image/png' && ref !== 'image/jpeg' && ref !== 'image/gif') {
|
|
return alert('仅支持 png, jpg, gif 图片格式');
|
|
}
|
|
return readFile();
|
|
});
|
|
|
|
inputItems.forEach(function(item) {
|
|
var el;
|
|
el = $('#' + item);
|
|
input[item] = el;
|
|
autoRefresh.addEventListener('change', function() {
|
|
if (this.checked) {
|
|
return refresh.setAttribute('disabled', 'disabled');
|
|
} else {
|
|
return refresh.removeAttribute('disabled');
|
|
}
|
|
});
|
|
el.addEventListener('input', function() {
|
|
if (autoRefresh.checked) {
|
|
return drawText();
|
|
}
|
|
});
|
|
return refresh.addEventListener('click', drawText);
|
|
});
|
|
|
|
}).call(this);
|