Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.07.2011, 18:11
denver вне форума Посмотреть профиль Отправить личное сообщение для denver Найти все сообщения от denver
  № 1  
Ответить с цитированием
denver

Регистрация: Jan 2010
Сообщений: 32
Attention BitmapData: искажение цвета при использовании метода draw с матрицей трансформации

Доброго денечка!

Налетел на следующие вилы при повороте битмапы:
1 вариант
Код AS3:
var bitmapData:BitmapData = new BitmapData(1, 10, false, 0xff0000);
var matrix:Matrix = new Matrix();
 
matrix.translate(-bitmapData.width/2, -bitmapData.height/2);
matrix.rotate(Math.PI * .5);
matrix.translate(bitmapData.height/2, bitmapData.width/2);
 
var retval:BitmapData = new BitmapData(bitmapData.height, bitmapData.width, false, 0);
retval.draw(bitmapData, matrix);
---------------
итого: на входе вертикальная линия цвета 0xff0000, на выходе горизонтальная цвета 0xff0000

2 вариант
все тоже самое только
Код AS3:
var bitmapData:BitmapData = new BitmapData(10, 1, false, 0xff0000);
...
---------------
итого: на входе горизонтальная линия цвета 0xff0000, на выходе вертикальная цвета 0xbf0000

Если увеличить height во втором варианте хотя бы до 2 pix, то цвет до и после поворота остается неизменным.

Есть ли выход избежать изменения цвета с сохранением width/height значений указанных в обоих вариантах?

Старый 31.07.2011, 18:45
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 2  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Код AS3:
Есть ли выход избежать изменения цвета с сохранением width/height значений указанных в обоих вариантах?
Есть - пройтись вручную по битмапдате, а не отрисовывать через draw.

Старый 31.07.2011, 18:47
denver вне форума Посмотреть профиль Отправить личное сообщение для denver Найти все сообщения от denver
  № 3  
Ответить с цитированием
denver

Регистрация: Jan 2010
Сообщений: 32
как быть с матричной трансформацией?

Старый 31.07.2011, 18:49
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 4  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Код AS3:
retval.setPixel(y, x, bitmapData.getPixel(x, y));

Старый 31.07.2011, 19:02
denver вне форума Посмотреть профиль Отправить личное сообщение для denver Найти все сообщения от denver
  № 5  
Ответить с цитированием
denver

Регистрация: Jan 2010
Сообщений: 32
i.o. Спасибо
К сожалению этот способ поворачивает картинку только туда\сюда, т.е. 0° -> 90° -> 0° -> ...
Интересно отчего через матрицу трансформаций и draw такие искажения выскочили.


Последний раз редактировалось denver; 31.07.2011 в 19:13.
Старый 31.07.2011, 19:36
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А Вы пробовали не сдвигать на полпикселя?
В любом случае при повороте НЕ на 90° цвет будет искажен. Но надо еще смутинг потестить.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 31.07.2011 в 19:39.
Старый 31.07.2011, 19:43
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 7  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Wolsh прав, если не кратно 90°, то искажения в любом случае будут. Что мешает использовать "ручной" проход при повороте, кратном 90°, а при остальных - использовать draw?

Старый 31.07.2011, 19:56
denver вне форума Посмотреть профиль Отправить личное сообщение для denver Найти все сообщения от denver
  № 8  
Ответить с цитированием
denver

Регистрация: Jan 2010
Сообщений: 32
поворот всегда кратен 90° и draw без сглаживания
почему тогда при width=1 height=10 искажений не возникает?
в случае "ручного" поворота придется хранить и передавать требуемый угол поворота, что не очч хочется

Старый 31.07.2011, 19:59
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 9  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Цитата:
в случае "ручного" поворота придется хранить и передавать требуемый угол поворота, что не очч хочется
а в случае draw не придется что ли?) Если там матрица передается, то можно извлечь из нее угол поворота, при желании.

Старый 31.07.2011, 20:14
denver вне форума Посмотреть профиль Отправить личное сообщение для denver Найти все сообщения от denver
  № 10  
Ответить с цитированием
denver

Регистрация: Jan 2010
Сообщений: 32
матрице всегда строго задается угол в 90 градусов, и матрица не передается в метод поворота
реализовано это одним статическим методом класса
Код AS3:
private static const MATRIX:Matrix = new Matrix();
...
public static function rotate(data:BitmapData):BitmapData
{
	MATRIX.identity();
	MATRIX.translate(-data.width/2, -data.height/2);
	MATRIX.rotate(Math.PI * .5);
	MATRIX.translate(data.height/2, data.width/2);
 
	var retval:BitmapData = new BitmapData(data.height, data.width, false, 0);
	retval.draw(data, MATRIX);
	return retval;
}

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:38.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.