Quindi la sfida che ho creato per me stesso è tale.Javascript - Elaborazione dati immagine e rendering div
Ho una foto fonte:
Source Photo http://f.cl.ly/items/012t1M250f0T101F2L0n/unicorn.jpg
Che io sto mappando i valori di colore e la creazione di una rappresentazione pixel di esso utilizzando div
Ecco il risultato:
Il codice con cui sto facendo questo è:
'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');
La variabile pixelDensity controlla quanto vicini sono i campioni di colore. Più piccolo è il numero, minore è il numero di campioni, impiegando meno tempo per produrre il risultato. Aumentando il numero, i campioni salgono e la funzione rallenta notevolmente.
Sono curioso di sapere cosa sta facendo questa cosa ci vuole così tanto tempo. Ho esaminato progetti leggermente simili, in particolare Jscii, che elaborano i dati dell'immagine molto più rapidamente, ma non riesco a capire quale sia la differenza che offre le prestazioni aggiuntive.
Grazie per il vostro aiuto!
Non toccare il DOM a meno che non sia necessario. Costruisci il tuo modello di oggetto fuori schermo e poi aggiungilo una volta. Presumibilmente, più campioni, più div, più modifiche. Quindi, costruito tutto fuori dallo schermo, aggiungilo tutto in una volta, una volta. –
Questo è quello che stavo facendo inizialmente, ma ho scoperto che tirare i dati dell'immagine era ciò che prendeva più tempo. Ci proverò di nuovo dato il consiglio qui sotto. Grazie per l'aiuto! – tylerdavis
Un'altra cosa. Quando stai cercando di ottenere ogni possibile prestazione, allora ogni piccola cosa aiuta. Cache per le condizioni del ciclo. 'per (var j = pixelDensity/2; j