Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Совместить две BitmapData (http://www.flasher.ru/forum/showthread.php?t=154222)

tanyakora 14.04.2011 12:38

Совместить две BitmapData
 
Я загружаю картинку с помощью bytearray, добавляю на сцену ее bitmapdata.
Подскажите, пожалуйста, как мне совместить (объединить) следующую загружаемую картинку с уже имеющейся (т.е. чтобы отображались обе)?
Т.к. сейчас происходит наложение одной на другую. Наиболее приближенный вариант получился с помощью merge
Код AS3:

myBit.merge( data, new Rectangle(0, 0, 300, 400), new Point(0, 0), 100, 100, 100, 100);

Но при последующей загрузке картинок видимость предыдущих постепенно затирается.

dimarik 14.04.2011 13:02

bytearray не умеет загружать картинки [x]

tanyakora 14.04.2011 13:10

Приведу код для ясности:
Код AS3:

var loader : Loader = new Loader();
var completeLoad :Function = function( in_event : Event ) : void {
 
        var myBitmap : Bitmap = Bitmap( loader.content );       
        var data : BitmapData = myBitmap.bitmapData;
 
        myBit.merge( data, new Rectangle(0,0,300,400), new Point(0,0), 100,100,0,0 );
 
        var bm:Bitmap = new Bitmap( myBit );
        mSkinOutput.addChild( bm );
}
 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeLoad);
loader.loadBytes( myByteArray );

Т.е. я перевожу картинку в bytearray, и мне нужно bitmapdata этого bytearray совместить с уже отрисованными картинками на сцене.

goodguy 14.04.2011 13:17

Лучше загрузить картинку через метод load(), а
для совмещения картинок намного лучше подойдет метод copyPixels класса BtimapData с последним параметром mergeAlpha = true

Ну или заюзать JPGDecoder, сконвертить байт массив в BitmapData и уже потом исползовать copyPixels()

tanyakora 14.04.2011 13:30

Попробовала copyPixels
Код:

        var myBitmap : Bitmap = Bitmap( loader.content );       
        var data : BitmapData = myBitmap.bitmapData;       
       
        var rect:Rectangle = new Rectangle(0, 0, 300, 400);
        var pt:Point = new Point(0, 0);
                               
        myBit.copyPixels(data, rect, pt, data, pt, true);

Все равно получается, что происходит копирование новой картинки без совмещения со старой...

goodguy 14.04.2011 13:37

Зачем вообще конвертировать картинку в байт массив, чтобы потом опять конвертировать в картинку?
Цитата:

Все равно получается, что происходит копирование новой картинки без совмещения со старой...
Что вы имеете в виду под словом совмещение? Как они должны совместиться? Склеиться в одну?

tanyakora 14.04.2011 13:43

Я рисую на сцене линию, потом перевожу ее в bytearray. Отправляю полученный массив на сервер, с которого другие флешки получают информацию (посредством сокетов) и должны отобразить на своих экранах нарисованную мной линию. Следующая линия, которую я рисую, должна отображаться у других юзеров вместе с первой. Постоянно полностью отправлять получающийся рисунок считаю нецелесообразно с точки зрения нагрузки на сервер.

gloomyBrain 14.04.2011 13:50

С точки зрения нагрузки на сервер тем более не рационально отправлять линию целиком. Можно отправлять:
- id кисти
- размер кисти
- id цвета
- прозрачность цвета
- начальную точку
- конечную точку

Если точек много, то чтобы не грузить сервер пакетами на каждый MouseMove можно отправлять сразу небольшой массив, если он весь нарисован одной кистью и одним цветом.

Далее, на клиенте проще всего это все рисовать в векторе. а затем через каждые N пакетов отрисовывать это все в BitmapData

tanyakora 14.04.2011 13:53

Линия может быть совершенно произвольной формы ( формируется по DOWN/UP мыши ), а также с заливкой и т.п.
Поэтому как-то больше склонилась к передаче данных через массив.

gloomyBrain 14.04.2011 13:57

Ну заливка - это отдельное действие, так? - ну так его и надо передавать. Вообще, я бы сделал примерно такую систему сообщений на сервер:
- выбрана кисть
- выбран цвет
- начал рисовать в точке (x1, y1)
- ... несколько точек по пути
- закончил рисовать в точке (x2, y2)
- выбрал заливку
- нажал "залить" в таком-то месте

При таком раскладе гораздо проще всем, ибо передается не само состояние, а только его изменение


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

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