Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как скопировать пиксели в ByteArray (http://www.flasher.ru/forum/showthread.php?t=171711)

denisko 22.11.2011 17:09

Как скопировать пиксели в ByteArray
 
Всем привет!)

Допустим я загрузил фотографию потом копирую пиксели в ByteArray
А потом хочу отобразить ее в другом месте, но не получается.
Код AS3:

var img:Loader = new Loader;
img.load(new URLRequest('http://чето_там.ру/шьпюозп'));
img.contentLoaderInfo.addEventListener(Event.INIT, function(e:Event):void {
img.x = 10;
img.y = 10;
addChild(img);
_i(img.width, img.height);
});
 
function _i(w:int, h:int):void {
var rect:Rectangle = new Rectangle(10, 10, w, h);
var bmd:BitmapData;
var pixels:ByteArray = new ByteArray();
pixels = bmd.getPixels(rect);
var l:Loader = new Loader;
l.loadBytes(pixels);
l.contentLoaderInfo.addEventListener(Event.INIT, function(e:Event):void {
l.x = 900;
l.y = 100;
addChild(l); // В итоги никакого изображения нет
});
}


Aquahawk 22.11.2011 17:20

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

А вообще вам не нужно сохранять пиксели в байтаррей и лоадить их, это бесполезно ибо лоадер будет лоадить только валидную картинку, а это просто каша из пикселей, без заголовков и прочего. Вместо этого вам нужно создать новый экземпляр BitmapData и отрисовать в него при помощи метода draw кусочек нужного вам изображения, а потом создать Bitmap с этой битмапдатой и его отобразить.

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

Добавлено через 2 часа 10 минут
Блин ступил, если вам не надо это дело ресайзить и поворачивать, то сделайте copyPixels, быстрее будет

silin 22.11.2011 19:46

>> нужно создать новый экземпляр BitmapData и отрисовать в него..
это если нужно, что далеко не всегда
можно тот же BitmapData использовать для создания сколько угодно копий
если нужен именно ByteArray, то взять его можно в bytes лоадера
Код AS3:

public function Main():void
{
        var img:Loader = new Loader;
        img.load(new URLRequest('face26.jpg'));
        img.contentLoaderInfo.addEventListener(Event.COMPLETE, img_complete);
        addChild(img);
}
 
private function img_complete(e:Event):void
{
        var li:LoaderInfo = LoaderInfo(e.target);
        //через ByteArray
        var ba:ByteArray = li.bytes;
        var imgCopy1:Loader = new Loader();
        imgCopy1.loadBytes(ba);
        addChild(imgCopy1).x = 150;
        // через BitmapData
        var bmd:BitmapData = Bitmap(li.content).bitmapData;
        var imgCopy2:Bitmap = new Bitmap(bmd);
        addChild(imgCopy2).x = 300;
 
}


denisko 22.11.2011 22:55

Aquahawk, можно пример?

Aquahawk 23.11.2011 00:36

Вложений: 1
Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.geom.Matrix;
        import flash.net.URLRequest;
 
        /**
        * ...
        * @author aquahawk
        */

        public class Main extends Sprite
        {
                private var loader:Loader;
                private var partBitmapData:BitmapData;
                private var partBitmap:Bitmap;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(evt:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
 
                        loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
 
                        var urlRequest:URLRequest = new URLRequest("fox.jpg");
                        loader.load(urlRequest);
                }
 
                private function onIoError(evt:IOErrorEvent):void
                {
                        trace("Can`t load");
                }
 
                private function onComplete(evt:Event):void
                {
                        addChild(loader);
 
                        partBitmapData = new BitmapData(200, 200);
 
                        var translationMatrix:Matrix = new Matrix();
                        translationMatrix.translate( -100, -100);
 
                        partBitmapData.draw(loader, translationMatrix);
 
                        partBitmap = new Bitmap(partBitmapData);
 
                        partBitmap.x = 410;
                        partBitmap.y = 100;
 
                        addChild(partBitmap);
                }
        }
}

Весь проект на FD приложен. Если работаете во FlashIde то назначьте в качестве DocumentClass класс Main.


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

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