Форум 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, могу быть орфаграфические ошибки

fish_r 06.07.2011 09:22

Не знаю как это правильно делается. Но, для отрисовки в draw() наклоненного объекта, я передавал в матрицу метода draw() матрицу объекта который отрисовывался, только надо учитывать, что содержимое объекта при повороте может смещаться в отрицательные координаты его пространства. Чтобы это компенсировать я помещал, временно, объект в спрайт и снимал getBounds() относительно спрайта....
Кто дружит с геометрией, наверное, сделает проще :)

silin 06.07.2011 11:47

мне видится это как-то так
Код AS3:

const W:Number = 200;
const H:Number = 100;
 
// битмап (здесь из Embed)
var bmp:Bitmap = new _img();
 
 
// контейнер
var sprite:Sprite = new Sprite();
bmp.x = -bmp.width / 2;
bmp.y = -bmp.height / 2;
sprite.addChild(bmp);
sprite.x = 200;
sprite.y = 200;
sprite.rotation = 65;//90
 
// прямоугольник
var rect:Sprite = new Sprite();
rect.graphics.lineStyle(1, 0xff0000);
rect.graphics.drawRect(0, 0, W, H);
rect.x = sprite.x - rect.width / 2;
rect.y = sprite.y - rect.height / 2;
 
//фрагмент
var matrix:Matrix = new Matrix();
var rectStagePoint:Point = rect.localToGlobal(new Point());
var rectBmpPoint:Point = bmp.globalToLocal(rectStagePoint);
 
matrix.translate( -rectBmpPoint.x, -rectBmpPoint.y);
matrix.rotate(Math.PI / 180 * sprite.rotation);
 
var bdata:BitmapData = new BitmapData(W, H, true, 0x00ffffff);
bdata.draw(bmp, matrix);
 
this.addChild(sprite);
this.addChild(rect);
// смотрим
var res:Bitmap = new Bitmap(bdata);
res.smoothing = true;
addChild(res).x=400;


Azo 06.07.2011 14:53

Ты гений! Что еще скажешь.. СПАСИБО ГУРУ!
никогда не встречал localToGlobal.. не знал о нем..

Добавлено через 5 минут
Результат http://vkontakte.ru/app2398570

fish_r 06.07.2011 18:48

...то, о чём я говорил (отрисовка наклонённого объекта, или его фрагмента) :

Код AS3:

...
 
 
                private function createBitmapData(obj:DisplayObject):void
                {
 
 
                        _rectShift = selectPosition(obj);
 
 
                        _dataObject = new BitmapData( obj.width, obj.height, true, 0x00 );
                        var matrix:Matrix = new Matrix(obj.transform.matrix.a,
                                                                                        obj.transform.matrix.b,
                                                                                        obj.transform.matrix.c,
                                                                                        obj.transform.matrix.d,
                                                                                        obj.transform.matrix.tx - obj.x - _rectShift.x,
                                                                                        obj.transform.matrix.ty - obj.y - _rectShift.y);
 
                        _dataObject.draw( obj , matrix, obj.transform.colorTransform );
 
                        _dObject = new Bitmap(_dataObject);
 
                }
 
                private function selectPosition(obj:DisplayObject):Rectangle
                {
                        var sp:Sprite = new Sprite();
                        var rect:Rectangle;
                        var childIndex:uint;
 
 
                        if ( obj.parent !== null)
                        {
                                childIndex = obj.parent.getChildIndex(obj);
                                obj.parent.addChildAt(sp, childIndex);
                                sp.x = obj.x;
                                sp.y = obj.y;
                                sp.addChild(obj);
                                rect = obj.getBounds(sp);
                                sp.parent.addChildAt(obj, childIndex);
                                obj.x = sp.x;
                                obj.y = sp.y;
                                obj.parent.removeChild(sp);
                                sp = null;
 
                        }
                        else
                        {
                                sp.addChild(obj);
                                rect = obj.getBounds(sp);
                                rect.x -= obj.x;
                                rect.y -= obj.y;
                                sp.removeChild(obj);
                                sp = null;
 
 
                        }
 
                        return rect;
 
                }

оффтоп. Нет опыта в использовании чужой графики. Вы не нарушаете права авторов этой графики? Или вы этот вопрос не рассматривали?

Azo 07.07.2011 00:09

Вы про приложение? Эту графику загружают пользователи сами. Так же как и вконтакте в целом))) весь ми нарушает...


кстати а как вырезать картинку в фроме микимауса? Только квадратиком можно? Silin знаете?

fish_r 07.07.2011 01:21

Пока silin не успел ответить... :) Не пробовал подобное, но предположу, что берется изображение и используется как карта пикселей для целевого изображения из исходного....


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

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