Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.09.2013, 22:07
Новичок на форуме
Отправить личное сообщение для iRomul Посмотреть профиль Найти все сообщения от iRomul
 
Регистрация: 16.09.2013
Сообщений: 4

Проблема с canvas
Имеется следующий код:
function FadeOff(canvas, path, mode) {

	var context = canvas.getContext("2d");
	var image = new Image();
	image.src = path;
		
	image.onload = function() {
		
		var al = 1;
		var TimerID = window.setInterval(function() {
			
			if(mode == "STRETCH")
				context.drawImage(image, 0, 0, _size, _size);
				
			if(mode == "ORIGINAL")
				context.drawImage(image, 0, 0);	
				
			al -= 0.05;
			putDebugMsg(round(al));
			context.globalAlpha = al;
			if(al <= 0.1) clearInterval(TimerID);
		
		}, 50);	
		
	}

}

Проблема в том, что эффект не работает. Т.е. таймер тикает, цикл выполняется, но картинка не обновляется. Если верить сообщениям, выводимым через putDebugMsg(), от переменная изменяется, и изменяется правильно. Более того - обратный эффект FadeIn работает абсолютно правильно. Вот его код:
case "FADE-IN":
  al = 0;			
  var TimerID = window.setInterval(function() {
    printImage(canvas, image, mode, round(al));
    al += 0.05;
    if(al >= 1) clearInterval(TimerID);
  }, 50);

Всё просто и логично. Почему же обратный эффект так себя ведёт? Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 16.09.2013, 23:36
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

iRomul,

идея всех "прозрачностей" на канве в том, что полупрозрачная картинка при своем рисовании как бы "добавляется", а не "замещает".
т.е., грубо говоря, если ты на абсолютно непрозрачном фоне нарисуешь полупрозрачный квадрат (альфа 0.5), то в канве не появится квадратная "дырка". Просто фон под квадратом будет виден слегка затемненным.

Так и тут - все более прозрачная картинка добавляется к самой себе непрозрачной, и никакого эффекта не видно. вот если бы ты предварительно полностью стирал картинку (оставляя прямоугольную "дырку"), а потом рисовал - да, эффект бы проявился.


а вообще, может обойтись выставлением opacity в стилях канвы?
Ответить с цитированием
  #3 (permalink)  
Старый 16.09.2013, 23:42
Новичок на форуме
Отправить личное сообщение для iRomul Посмотреть профиль Найти все сообщения от iRomul
 
Регистрация: 16.09.2013
Сообщений: 4

Яростный Меч,
блин, а ведь и правда! Я об этом даже не подумал. По поводу opacity - получается, что общая прозрачность будет меняться, а канвас у меня черный на белом фоне - будет выглядить странно. Я попробую просто заполнять промежуточные кадры черным прямоугольником. Правда за производительность беспокоюсь - не будет ли излишне тяжёлой такая операция (рисовать картинку + прямоугольник)?
Ответить с цитированием
  #4 (permalink)  
Старый 16.09.2013, 23:52
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

щас откопал одну фичу - http://www.xiper.net/manuals/canvas/...Operation.html
опция может менять поведение полупрозрачных рисований (есть значение "copy", но оно затирает вообще все)
Ответить с цитированием
  #5 (permalink)  
Старый 17.09.2013, 00:08
Новичок на форуме
Отправить личное сообщение для iRomul Посмотреть профиль Найти все сообщения от iRomul
 
Регистрация: 16.09.2013
Сообщений: 4

Подложка канвы белого цвета, по-этому и изображение растворяется на белый фон. Может у канвы есть свойство цвета подложки?
Ответить с цитированием
  #6 (permalink)  
Старый 17.09.2013, 00:09
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

в общем, можно так сделать: пример
// рисуем непрозрачную картинку 
ctx.fillStyle = "rgba(0,0,0, 1)";
ctx.fillRect(0, 0, 100, 100);

// выставляем режим замещения
ctx.globalCompositeOperation = "copy";

// делаем область отсечения. Это нужно, если кроме картинки на канве ещё что-то есть,
// и это что-то не должно потеряться из-за "copy"
ctx.beginPath();
ctx.moveTo(0,0);
ctx.lineTo(0,100);
ctx.lineTo(100,100);
ctx.lineTo(100,0);
ctx.closePath();
ctx.clip();

// рисуем полупрозрачную картинку. она сначала затрет старую, потом нарисуется.
ctx.fillStyle = "rgba(0,0,0, 0.5)";
ctx.fillRect(0, 0, 100, 100);
Ответить с цитированием
  #7 (permalink)  
Старый 17.09.2013, 00:17
Новичок на форуме
Отправить личное сообщение для iRomul Посмотреть профиль Найти все сообщения от iRomul
 
Регистрация: 16.09.2013
Сообщений: 4

Зачем через линии? Есть же прямоугольник.
Решил проблему несколько иначе - я нарисовал картинку с альфой 1 и циклически рисую поверх неё черный полупрозрачный прямоугольник.
Спасибо за помощь! Наконец-то решил эту проблему.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
canvas img draw проблема max0n Общие вопросы Javascript 2 04.07.2013 21:31
Почему неправильно вырисовывается canvas? Amateur Events/DOM/Window 0 19.09.2012 10:45
Создание экземпляра Canvas не затрагивая HTML Tails Общие вопросы Javascript 2 09.03.2012 13:55
Добавить на canvas еще один елемент greengarlic Общие вопросы Javascript 5 22.09.2010 10:16
Canvas: drawImage проблема. Jurasmi jQuery 3 11.01.2010 14:57