2016-02-02 6 views
4

Я ищу возможность изменить фон веб-страницы на динамически генерируемое изображение во время выполнения. Я использую javascript и элемент canvas для создания фона, который я храню в массиве, чтобы пользователь мог переключаться между ними; образы JPEGsДинамическое изменение фонового изображения с помощью javascript

// canvas computations snipped 

var img = c.toDataURL("image/jpeg"); 
this.modifiedanimationarray[0] = new Image(); 
this.modifiedanimationarray[0].src = img; 

Однако я заметил, что Javascript манипулировать фон выглядит следующим образом:

document.body.style.backgroundImage = "url('whatever.jpg')"; 

хочет изображение из URL, который создается без динамически. Есть ли способ заставить document.body.style.backgroundImage принять образ, созданный «на лету», а не просто погрузить его из домена?

+0

Что вы подразумеваете под натиском? – Trix

+0

Я имею ввиду сгенерированный в ответ на то, что пользователь делает на веб-странице, а не извлекает изображение с веб-сайта. Таким образом, изображение «на лету» создается по мере необходимости. – EventHorizon

+0

Да, это можно сделать. проверьте мой обновленный ответ. См. Это в действии по моему ответу ниже – Trix

ответ

4

toDataURL предоставит вам URL-адрес данных, который может использоваться вместо обычного URL-адреса. Так что вместо того, чтобы делать сказать

document.body.style.backgroundImage = 'url(someimage.jpg)'; 

просто заменить URL, в этом случае someimage.jpg с URL вы получили от toDataURL

document.body.style.backgroundImage = 'url('+canvas.toDataURL("image/jpeg")+')'; 

Demo

function getBG(){ 
 
    var canvas = document.getElementById('bgcanvas'), 
 
     context = canvas.getContext('2d'), 
 
     cX = canvas.width/2, 
 
     cY = canvas.height/2; 
 
     context.beginPath(); 
 
     context.arc(cX, cY, 70, 0, 2 * Math.PI, false); 
 
     context.fillStyle = 'green'; 
 
     context.fill(); 
 
     context.stroke(); 
 
    return canvas.toDataURL("image/jpeg"); 
 
} 
 

 
document.body.style.backgroundImage = 'url('+getBG()+')';
canvas { 
 
    display:none; 
 
}
<canvas id="bgcanvas" width="200" height="200"></canvas>

Также обратите внимание, что вам не нужно загружать URL-адрес данных в объект изображения перед его использованием. Значение вам не нужно делать:

var img = c.toDataURL("image/jpeg"); 
this.modifiedanimationarray[0] = new Image(); 
this.modifiedanimationarray[0].src = img; 

Вы бы просто сделать

var img = c.toDataURL("image/jpeg"); 
this.modifiedanimationarray[0] = img; 
document.body.style.backgroundImage = 'url('+this.modifiedanimationarray[0]+')'; 
//or just 
document.body.style.backgroundImage = 'url('+img+')'; 
+0

Спасибо, это похоже на то, что я хочу. Позор, я не могу заставить остальную часть кода работать! – EventHorizon

1

Вы можете использовать результат toDataURL как реальный URL.

var img = c.toDataURL("image/jpeg"); 
document.body.style.backgroundImage = "url(" + img + ")"; 
+0

Итак, что-то вроде этого: \t this.modifiedanimationarray [0] = new Изображение(); \t this.modifiedanimationarray [0] .src = img; \t this.modifiedanimationarray [1] = new Image(); \t this.modifiedanimationarray [1] .src = img; document.body.style.backgroundImage = "url (" + this.modifiedanimationarray [0] + ")"; и: document.body.style.backgroundImage = "url (" + this.modifiedanimationarray [1] + ")"; – EventHorizon

+0

Одна вещь, которая касается меня, - это использование тега «src» при назначении элемента массива «удерживать» созданное изображение; использовать один и тот же тег при назначении backgroundimage, например document.body.style.backgroundImage = "url (" + this.modifiedanimationarray [0].src + ")"; или нет? Я думаю, что вам не нужно (??) – EventHorizon

+1

@EventHorizon, если 'this.modifiedanimationarray [0] .src' - это место, где вы храните URL-адрес данных, который вы получаете от toDataURL, тогда да, именно так вы его используете , Обратите внимание, хотя вам не нужно использовать объект изображения для его сохранения/загрузки, вы просто используете его. –

Смежные вопросы