Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   BitmapData: искажение цвета при использовании метода draw с матрицей трансформации (http://www.flasher.ru/forum/showthread.php?t=162318)

denver 31.07.2011 18:11

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 значений указанных в обоих вариантах?

i.o. 31.07.2011 18:45

Код AS3:

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

Есть - пройтись вручную по битмапдате, а не отрисовывать через draw.

denver 31.07.2011 18:47

как быть с матричной трансформацией?

i.o. 31.07.2011 18:49

Код AS3:

retval.setPixel(y, x, bitmapData.getPixel(x, y));


denver 31.07.2011 19:02

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

Wolsh 31.07.2011 19:36

А Вы пробовали не сдвигать на полпикселя?
В любом случае при повороте НЕ на 90° цвет будет искажен. Но надо еще смутинг потестить.

i.o. 31.07.2011 19:43

Wolsh прав, если не кратно 90°, то искажения в любом случае будут. Что мешает использовать "ручной" проход при повороте, кратном 90°, а при остальных - использовать draw?

denver 31.07.2011 19:56

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

i.o. 31.07.2011 19:59

Цитата:

в случае "ручного" поворота придется хранить и передавать требуемый угол поворота, что не очч хочется
а в случае draw не придется что ли?) Если там матрица передается, то можно извлечь из нее угол поворота, при желании.

denver 31.07.2011 20:14

матрице всегда строго задается угол в 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, время: 20:20.

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