Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как вырезать bitmapdata с rotation (http://www.flasher.ru/forum/showthread.php?t=159637)

Azo 03.07.2011 16:12

Как вырезать bitmapdata с rotation
 
Привет.

Есть у меня Bitmap1 внитри Sprite MCBMP,

Bitmap1 поворачиваю на любой градус и центрую.

есть поверх Sprite еще и один прямоугольник rect1 130x520


надо Составить Matrix так чтобы вырезать BitmapData от Bitmap по размерам Sprite(2) учитывая повороты


Код AS3:

var matrix:Matrix = new Matrix();
matrix.tx = rect.x
matrix.ty = rect.y
matrix.rotate(Bitmap1.rotation);
 
 
var bdata:BitmapData = new BitmapData(130, 520, true,  Utils.BLUE_BK_COL);
bdata.draw(MCBMP,matrix, null, null, new Rectangle(0, 0, 130, 520), true);

белеберда получается(

silin 03.07.2011 21:55

bitmap.rotation в градусах, а matrix.rotate принимает радианы
может в этом дело

Azo 04.07.2011 23:09

Да! Точно... Почему так сделали?)спасибо! С поворотом разобрались...
еще вопрос:

Есть картинка 800x600
Вырезаем ее с помощью матрицы tx=100 ty=100 и все работает!
А вот если картинку повернуть на какой нибудь градус и к матрице добавить rotate угол в радианах - то tx и ty уже надо другие брать? Криво вырезает

silin 04.07.2011 23:17

в терминах Matrix повернуть и потом сдвинуть != сдвинуть и потом повернуть

Azo 04.07.2011 23:44

Значит надо сдвинуть потом повернуть? Спасибо большое. Завтра посмотрим)

-De- 05.07.2011 09:28

Я делал при помощи pixelBounds. Только там веселуха, если обьект не добавлен в дисплей лист, то они ровно в 5 раз больше %)

Azo 05.07.2011 23:18

Ничего не вышло =(((( весь день возился(((

вообще надо просто умножить на sin или cos чего то там угла поворота... Но как именно?



или как применить pixelBounds??

silin 05.07.2011 23:53

Цитата:

Есть у меня Bitmap1 внитри Sprite MCBMP,
Bitmap1 поворачиваю на любой градус и центрую.
есть поверх Sprite еще и один прямоугольник rect1 130x520
надо Составить Matrix так чтобы вырезать BitmapData от Bitmap по размерам Sprite(2) учитывая повороты
к решению таких задач надо подходить осторожно, очень постепенно надо подходить
вот народ и осторожничает, потому как закаленных людей, что не боятся переломов мозга мало, нет их почти

-De- 06.07.2011 00:04

Похоже, занимались брутфорс программированием >_<
Поворачиваем спрайт на минус поворот битмапы, с помощью pixelBounds узнаем её размеры и положение, создаем её, может, рендерим в неё, потом поворачиваем обратно спрайт и битмапу (она до того какбэ не повёрнута).
Это если верно понял, что надо.
Сделайте проектик, где можно понять, что надо и чтоб можно было сделать там же (fla я не открою и не только я). Тогда если он нормальный, то пара строк написать всего надо будет (меньше блин, чем этот пост - точно).

Azo 06.07.2011 02:58

Так)) ну попробую сюда вписать:

Код AS3:

 
//есть у нас лоадер который загружен через fileReferance
//и вытаскиваем из него картинку и вставляем на экран
 
var bmp:Bitmaploader.content as Bitmap;
 
// если мы просто добавим на экран bmp то при rotate - он будет поворачиваться от начала его координат
// а мне надо чтобы вращался вокруг своейго цента и поэтому я решил создать Sprite и вставить в него bmp
 
var sprite: Sprite = new Sprite();
bmp.x=-bmp.width/2;
bmp.y=-bmp.height/2;
sprite.addChild(bmp);
this.addChild(sprite);
//на sprite вещаем listeners на перемещение зажимая мышкой чтобы перемещать туда сюда...
// это сейчас не суть и поэтому упустим этот бытовой стандартный код
 
// теперь нарисуем поверх всего прямоугольник , который означает служит маской вырезания изображения
var rect:Sprite=new Sprite();
rect.graphics.lineStyle(1,0xff0000);
rect.graphics.drawRect(0,0,130,520);
rect.x=srite.width/2-rect.width/2;
rect.y=sprite.height/2-rect.height/2;// расположили в центре картинки
this.addChild(rect);
 
 
/// теперь эксперементы...
///-----------------------------------------------
///-----------------------------------------------
///-----------------------------------------------
///-----------------------------------------------
 
var matrix:Matrix=new Matrix();
matrix.tx=-sprite.width/2 +rect.x- sprite.x;
matrix.ty=-sprite.height/2+rect.y-sprite.y;
 
//создаем bitmapData и вырезаем в него кусок из картинки bmp маской rect у которого размеры 130x520
 
var bdata:BitmapData = new BitmapData(130, 520, true,  0xffffff);
bdata.draw(bmp,matrix, null, null, new Rectangle(0, 0, 130, 520), true);
// вырезается все нормально и правильно
 
//----------------------------
///-----------------------------------------------
///-----------------------------------------------
///-----------------------------------------------
///-----------------------------------------------
///-----------------------------------------------
 
// а теперь тоже самое но с повернутой картинкой !!!!!!!!!!!!!!!!!!!!!!!!!!
sprite.rotation=90;
 
 
var matrix:Matrix=new Matrix();
matrix.tx=-sprite.width/2 +rect.x- sprite.x;
matrix.ty=-sprite.height/2+rect.y-sprite.y;
matrix.rotate(sprite.rotation*180/Math.PI) // и в матрице делаем поворот , только перевели в радианы
 
//создаем bitmapData и вырезаем в него кусок из картинки bmp маской rect у которого размеры 130x520
 
var bdata:BitmapData = new BitmapData(130, 520, true,  0xffffff);
bdata.draw(bmp,matrix, null, null, new Rectangle(0, 0, 130, 520), true);
// вырезается криво!!!!! Угол поворота задан верно, но tx и ty сбиваются :-(



P.s.
Писал с ipad, могу быть орфаграфические ошибки


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

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