Wyzwanie, które sam sobie stworzyłem, jest takie.JavaScript - Przetwarzanie danych obrazu i renderowanie div
Mam zdjęcie źródło:
Source Photo http://f.cl.ly/items/012t1M250f0T101F2L0n/unicorn.jpg
, że jestem mapowania wartości kolorów i tworzenia piksele reprezentację nim za pomocą div
oto wynik:
Kod, który wykonuję to jest:
'use strict';
var imageSource = 'images/unicorn.jpg';
var img = new Image();
img.src = imageSource;
var canvas = $('<canvas/>')[0];
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
var context = canvas.getContext('2d');
console.log('img height: ' + img.height);
console.log('img width: ' + img.width);
var pixelDensity = 70;
var timerStart = new Date();
for (var i = pixelDensity/2; i < img.height; i += (img.height/pixelDensity)) {
$('.container').append($('<div class="row">'));
for(var j = pixelDensity/2; j < img.width; j += img.height/pixelDensity) {
var value = context.getImageData(j, i, 1, 1).data;
var colorValue = 'rgb(' + value[0] + ', ' + value[1] + ', ' + value[2] + ')';
$('.row:last').append($('<div class="block">').css({'background-color' : colorValue}));
}
}
var timerStop = new Date();
console.log(timerStop - timerStart + ' ms');
Zmienna pixelDensity określa, jak blisko siebie znajdują się próbki kolorów. Im mniejsza liczba, tym mniej próbek, tym mniej czasu na uzyskanie wyniku. W miarę zwiększania liczby próbki wzrastają, a funkcja znacznie się zwalnia.
Jestem ciekawa, co sprawia, że to zajmuje tak długo. Przyjrzałem się nieco podobnym projektom - w szczególności Jscii - które przetwarzają dane obrazu znacznie szybciej, ale nie mogę zrozumieć, jaka jest różnica, która oferuje dodatkową wydajność.
Dzięki za pomoc!
Nie dotykać DOM chyba trzeba. Zbuduj swój model obiektu poza ekranem, a następnie dołącz go raz. Przypuszczalnie im więcej próbek, tym więcej elementów div, tym więcej edytuje dom. Tak więc, zbudowałem wszystko poza ekranem, dodałem je wszystkie naraz, jeden raz. –
To było to, co pierwotnie robiłem, ale odkryłem, że ciągnięcie danych obrazu było tym, co zabierało najwięcej czasu. Spróbuję jeszcze raz, biorąc pod uwagę porady poniżej. Dzięki za pomoc! – tylerdavis
Kolejna sprawa. Kiedy próbujesz wyczuć każdą możliwą wydajność, wtedy każda drobna rzecz pomaga. Buforuj warunki pętli for. 'Do (zmienna J = pixelDensity/2 j