const MAX_PIXELS = 80;
const sizeText = document.getElementById("size-text");
sizeText.innerHTML = "(< " + MAX_PIXELS + "px)";
const dropload = document.getElementById("dropload");
// drop event
dropload.addEventListener("drop", dropHandler);
window.addEventListener("drop", (e) => {
if ([...e.dataTransfer.items].some((item) => item.kind === "file")) {
e.preventDefault();
}
});
// dragover event
dropload.addEventListener("dragover", (e) => {
const fileItems = [...e.dataTransfer.items].filter(
(item) => item.kind === "file",
);
if (fileItems.length > 0) {
e.preventDefault();
if (fileItems.some((item) => item.type.startsWith("image/"))) {
e.dataTransfer.dropEffect = "copy";
} else {
e.dataTransfer.dropEffect = "none";
}
}
});
window.addEventListener("dragover", (e) => {
const fileItems = [...e.dataTransfer.items].filter(
(item) => item.kind === "file",
);
if (fileItems.length > 0) {
e.preventDefault();
if (!dropload.contains(e.target)) {
e.dataTransfer.dropEffect = "none";
}
}
});
const preview = document.getElementById("preview");
function displayImages(files) {
for (const file of files) {
if (file.type.startsWith("image/")) {
const li = document.createElement("li");
const img = document.createElement("img");
img.src = URL.createObjectURL(file);
img.onload = function() {
// don't allow images bigger than max
if (this.width <= MAX_PIXELS && this.height <= MAX_PIXELS) {
img.alt = file.name;
li.classList.add('clickable');
li.appendChild(img);
li.appendChild(document.createTextNode(" click to get pixelstats"));
li.addEventListener("click", (e) => {
getPixelStats(e, file)
});
} else {
li.appendChild(document.createTextNode('file \"' + file.name + '\" is bigger than ' + MAX_PIXELS + 'px'));
}
preview.appendChild(li);
}
}
}
}
function dropHandler(e) {
e.preventDefault();
const files = [...e.dataTransfer.items]
.map((item) => item.getAsFile())
.filter((file) => file);
displayImages(files);
}
const fileInput = document.getElementById("file-input");
fileInput.addEventListener("change", (e) => {
displayImages(e.target.files);
});
// clear button
const clearButton = document.getElementById("clear");
clearButton.addEventListener("click", () => {
for (const img of preview.querySelectorAll("img")) {
URL.revokeObjectURL(img.src);
}
preview.textContent = "";
});
// show pixel stats
const stats = document.getElementById("stats");
function getPixelStats(e, file) {
stats.innerHTML = "";
const formData = new FormData();
formData.append('image', file);
const element = e.target;
fetch('/process-pixels', {
method: 'POST',
body: formData
}).then(
response => response.json()
).then(
success => {
const data = JSON.parse(success.processed);
console.log(data);
let colorTable = '
';
for (const [color, count] of Object.entries(data.colors.colorsDistributionSorted)) {
colorTable += '| | ' + count + ' (' + (count / (data.width * data.height) * 100).toFixed(3) + '%) |
';
}
colorTable += '
';
stats.innerHTML = 'file stats
' +
'| name | ' + data.fileName +
' |
| size | ' + data.fileSize +
' |
|---|
| type | ' + data.fileType +
' |
|---|
| width | ' + data.width +
' |
|---|
| height | ' + data.height +
' |
|---|
pixel color distribution
' + colorTable;
}
).catch(
error => console.log(error)
);
};