Как изменить непрозрачность (Альфа, прозрачность) элемента в элементе canvas после его рисования?
С помощью HTML5 <canvas>
элемент, я хотел бы загрузить файл изображения (PNG, JPEG и т. д.), нарисуйте его на холсте полностью прозрачно, а затем затушите его. Я понял, как загрузить изображение и нарисовать его на холсте, но я не знаю, как изменить его непрозрачность после того, как он был нарисован.
вот код у меня есть до сих пор:
var canvas = document.getElementById('myCanvas');
if (canvas.getContext)
{
var c = canvas.getContext('2d');
c.globalAlpha = 0;
var img = new Image();
img.onload = function() {
c.drawImage(img, 0, 0);
}
img.src = 'image.jpg';
}
кто-нибудь может мне точку в правильном направлении, как свойство или функцию для вызова, который изменит непрозрачность?
7 ответов:
Я также ищу ответ на этот вопрос (чтобы уточнить, я хочу иметь возможность рисовать изображение с определенной пользователем непрозрачностью, например, как вы можете рисовать фигуры с непрозрачностью) если вы рисуете с примитивными фигурами, вы можете установить заливку и цвет Штриха с Альфой, чтобы определить прозрачность. Насколько я заключил прямо сейчас, это, похоже, не влияет на рисование изображений.
//works with shapes but not with images ctx.fillStyle = "rgba(255, 255, 255, 0.5)";
Я пришел к выводу, что установка
globalCompositeOperation
работает с изображениями.//works with images ctx.globalCompositeOperation = "lighter";
интересно, если существует какой-то третий способ настройки цвета, так что мы можем подкрасить изображения и сделать их прозрачными легко.
EDIT:
после дальнейшего копания я пришел к выводу, что вы можете установить прозрачность изображения, установив
globalAlpha
параметр перед рисованием изображения://works with images ctx.globalAlpha = 0.5
если вы хотите достичь эффекта затухания с течением времени вам нужен какой-то цикл, который изменяет значение альфа, это довольно легко, один из способов его достижения - это
setTimeout
функция, посмотрите, что до создания цикла, из которого вы изменяете Альфа с течением времени.
более простой пример кода для использования
globalAlpha
:ctx.save(); ctx.globalAlpha = 0.4; ctx.drawImage(img, x, y); ctx.restore();
Если вам нужно
img
будет загружен:var img = new Image(); img.onload = function() { ctx.save(); ctx.globalAlpha = 0.4; ctx.drawImage(img, x, y); ctx.restore() }; img.src = "http://...";
Примечания:
установить
'src'
последние, чтобы гарантировать, что вашonload
обработчик вызывается на всех платформах, даже если изображение уже находится в кэше.оберните изменения в такие вещи, как
globalAlpha
междуsave
иrestore
(на самом деле использовать их много), чтобы убедиться, что вы не clobber настройки из в другом месте, особенно когда биты кода чертежа будут вызваны из событий.
Edit:
ответ, отмеченный как "правильный", не является правильным.Это легко сделать. Попробуйте этот код, меняя местами " ie.jpg " с любой картинкой у вас под рукой:
<!DOCTYPE HTML> <html> <head> <script> var canvas; var context; var ga = 0.0; var timerId = 0; function init() { canvas = document.getElementById("myCanvas"); context = canvas.getContext("2d"); timerId = setInterval("fadeIn()", 100); } function fadeIn() { context.clearRect(0,0, canvas.width,canvas.height); context.globalAlpha = ga; var ie = new Image(); ie.onload = function() { context.drawImage(ie, 0, 0, 100, 100); }; ie.src = "ie.jpg"; ga = ga + 0.1; if (ga > 1.0) { goingUp = false; clearInterval(timerId); } } </script> </head> <body onload="init()"> <canvas height="200" width="300" id="myCanvas"></canvas> </body> </html>
ключ-это свойство globalAlpha.
протестировано с IE 9, FF 5, Safari 5 и Chrome 12 на Win7.
пост старый до сих пор я пойду с моим предложением. Предложение основано на манипуляции с пикселями в контексте холста 2d. От MDN:
вы можете непосредственно манипулировать пиксельными данными в холстах на байтовом уровне
для управления пикселями мы будем использовать две функции здесь-getImageData и putImageData
использование функции getImageData:
var myImageData = контекст.getImageData (слева, сверху, ширина, высота);
и putImageData синтаксис:
контексте.putImageData (myImageData, dx, dy); //DX, DY - X и y смещение на вашем холсте
здесь контекст - это 2D-контекста Canvas
так, чтобы получить красный зеленый синий и Альфа-значения, мы делаем следующее:
var r = imageData.data[((x*(imageData.width*4)) + (y*4))]; var g = imageData.data[((x*(imageData.width*4)) + (y*4)) + 1]; var b = imageData.data[((x*(imageData.width*4)) + (y*4)) + 2]; var a = imageData.data[((x*(imageData.width*4)) + (y*4)) + 3];
здесь x смещение x,y смещение y на холсте
Итак, у нас есть код, создающий изображение половина-прозрачный
var canvas = document.getElementById('myCanvas'); var c = canvas.getContext('2d'); var img = new Image(); img.onload = function() { c.drawImage(img, 0, 0); var ImageData = c.getImageData(0,0,img.width,img.height); for(var i=0;i<img.height;i++) for(var j=0;j<img.width;j++) ImageData.data[((i*(img.width*4)) + (j*4) + 3)] = 127;//opacity = 0.5 [0-255] c.putImageData(ImageData,0,0);//put image data back } img.src = 'image.jpg';
вы можете сделать свои собственные "шейдеры" - см. полную статью MDN здесь
вы можете. Прозрачный холст может быть быстро исчезли с помощью destination-out глобальная составная операция. Это не 100% идеально, иногда он оставляет некоторые следы, но его можно настроить, в зависимости от того, что нужно (т. е. использовать "источник-над" и заполнить его белым цветом с Альфой на 0,13, а затем исчезать, чтобы подготовить холст).
// Fill canvas using 'destination-out' and alpha at 0.05 ctx.globalCompositeOperation = 'destination-out'; ctx.fillStyle = "rgba(255, 255, 255, 0.05)"; ctx.beginPath(); ctx.fillRect(0, 0, width, height); ctx.fill(); // Set the default mode. ctx.globalCompositeOperation = 'source-over';
Если вы используете jCanvas библиотека вы можете использовать прозрачность собственность при рисовании. Если вам нужен эффект затухания поверх этого, просто перерисуйте с разными значениями.
вы не можете. Это немедленное графическом режиме. Но вы можете смоделировать его, нарисовав прямоугольник над ним в фоновом цвете с непрозрачностью.
Если изображение находится над чем-то другим, чем постоянный цвет, то он становится совсем немного сложнее. В этом случае вы должны иметь возможность использовать методы обработки пикселей. Просто сохраните область перед рисованием изображения, а затем смешайте ее сверху с непрозрачностью после этого.