Перед тем, как вы go скажете, что я сумасшедший, поверьте, я знаю. Я не собираюсь создавать веб-сайт, который быстро отображается, быстро загружается или получает высокий балл Lighthouse. Я просто хочу, чтобы это работало.
У меня есть javascript, который улавливает все цвета пикселей изображения. С помощью этой функции я создаю элемент div размером 1px на 1px и устанавливаю цвет фона на цвет пикселя с теми же координатами. Затем координаты используются для установки верхнего и левого значений. Мой код делает то, что ему говорят.
Вот моя проблема, мое изображение составляет 700 пикселей на 387 пикселей. Если вы сделаете математику, получится 270 900 html элементов. Chrome, просто не для этого безумия. Я хочу увидеть эту работу, я хочу каким-то образом «вручную» создать изображение с элементами div. Мой процессор выходит из строя, когда я пытаюсь это сделать, и я уверен, что в конечном итоге у меня закончится оперативная память.
Все работает нормально, если я пробую только сотни или несколько тысяч пикселей, но еще больше, и chrome умирает. Я не уверен, что это может быть моей проблемой в браузере, или chrome не может отобразить такое количество элементов, или и то, и другое. Полагаю, я мог бы проделать те же вычисления на своем сервере с помощью python и добавить его к html, но тогда chrome, вероятно, не смог бы его отобразить.
Очевидно, это не очень важно, просто развлечение. Думаю, сообществу тоже понравится этот вызов.
Вот вычисление 100 пикселей:
onload = e => {
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
function img(x, y) {
var img = document.getElementById('my-image');
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
var pixelData = canvas.getContext('2d').getImageData(x, y, 1, 1).data;
return rgbToHex(pixelData[0], pixelData[1], pixelData[2]);
}
//x = 700 y = 387
for (var x = 0; x < 10; x++) {
for (var y = 0; y < 10; y++) {
document.body.insertAdjacentHTML("beforeend", "<div style='top:" + y + "px; left:" + x + "px;background:" + img(x, y) + ";' />");
}
}
};
div {
position: absolute;
width: 1px;
height: 1px;
}
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/New_born_Frisian_red_white_calf.jpg/640px-New_born_Frisian_red_white_calf.jpg" id="my-image" crossorigin="anonymous">
здесь вычисление 2500 пикселей (все еще работает, требует времени)
onload = e => {
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
function img(x, y) {
var img = document.getElementById('my-image');
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
var pixelData = canvas.getContext('2d').getImageData(x, y, 1, 1).data;
return rgbToHex(pixelData[0], pixelData[1], pixelData[2]);
}
//x = 700 y = 387
for (var x = 0; x < 50; x++) {
for (var y = 0; y < 50; y++) {
document.body.insertAdjacentHTML("beforeend", "<div style='top:" + y + "px; left:" + x + "px;background:" + img(x, y) + ";' />");
}
}
};
div {
position: absolute;
width: 1px;
height: 1px;
}
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/New_born_Frisian_red_white_calf.jpg/640px-New_born_Frisian_red_white_calf.jpg" id="my-image" crossorigin="anonymous">
Ура, Исаа c.