Почему мой код изменения размера не работает? - PullRequest
1 голос
/ 22 июня 2011

Ситуация в том, что этот код изменения размера всегда работал для меня, потому что я использовал локальные изображения. Сейчас я использую стороннего администратора, который передает изображения через application/octet-stream.

Тогда как ранее я загружал изображение методом Loader::load, но в настоящее время я использую Loader::loadBytes для загрузки двоичных данных, потому что я получаю поток вместо image/jpeg.

При переключении на поток код теперь не может пройти эту строку:

resizedImageData.copyPixels(e.currentTarget.getChildAt(0).bitmapData, cropRect, new Point(0, 0));

В этом фрагменте:

    if((postcardWidth != postcardImage.width || postcardHeight != postcardImage.height) ) {
        ExternalInterface.call( "console.log" , "IF");

        var resizedImageData:BitmapData = new BitmapData(postcardWidth, postcardHeight);
                    ExternalInterface.call( "console.log" , "IF2");

        var cropRect:Rectangle = new Rectangle(e.currentTarget.width / 2 - postcardWidth / 2, e.currentTarget.height / 2 - postcardHeight / 2, postcardWidth, postcardHeight);

                    ExternalInterface.call( "console.log" , "IF3");

        resizedImageData.copyPixels(e.currentTarget.getChildAt(0).bitmapData, cropRect, new Point(0, 0));

                    ExternalInterface.call( "console.log" , "IF4");


        var resizedImage:Bitmap = new Bitmap(resizedImageData);

                    ExternalInterface.call( "console.log" , "IF5");

        postcardFront.addChild(resizedImage);

                    ExternalInterface.call( "console.log" , "IF6");

    } else {
        ExternalInterface.call( "console.log" , "ELSE");
        postcardFront.addChild(postcardImage);
    }

Значение postcardWidth всегда равно 680, postcardImage.width равно 600, postcardHeight равно 442, а postcardImage.height равно 429.

Кажется, единственный виновник может быть непоследовательным bitmapData?

Я сравнил рабочий jpeg и нерабочий jpeg с помощью diff и открыл их как в vim, и они начинаются с одного и того же символа, заканчиваются одним и тем же символом, выглядят на 100% одинаково и охватывают такое же количество строк (двоичные данные).

Кто-нибудь знает, почему эта строка будет работать на одном изображении, а не на другом?

БОЛЬШЕ КОДА

Здесь используется метод loadBytes: http://pastie.org/private/h463eu7cbx1vnhtxzq8xyg. Этот фрагмент находится во внешнем файле .as.

Этот код взят из fla и представляет собой код из оригинального фрагмента, который я вставил выше в вопросе: http://pastie.org/private/vmwp4sw8urupdx91qny4w

1 Ответ

2 голосов
/ 22 июня 2011

Хорошо, взяв код, который вы вставили на pastie.org, я заново создал класс Image и провел несколько тестов.Три вещи, кажется, проблема.Первая строка:

e.currentTarget.getChildAt(0).bitmapData

Это класс Image, который отправляет Event.COMPLETE, что означает, что это currentTarget.Первый дочерний элемент, полученный из этого класса, - это объект Loader, который вы добавляете.Loader не имеет bitmapData объекта, поэтому этот объект выдаст сообщение «невозможно получить доступ к свойству из-за ошибки нулевого объекта».

Второе - это, предполагая, что вы должнынацеливаться на объект Image здесь, а bitmapData - это объект BitmapData, который вы создаете в функции makeBitmapData() (из http://pastie.org/private/h463eu7cbx1vnhtxzq8xyg), нет открытого доступа к BitmapData. В моей версиикласс, я добавил геттер.

В-третьих, событие Event.COMPLETE отправляется до вызова makeBitmapData(), что означает, что даже если вы сможете получить к нему доступ, оно будетбыть нулевым.

Поскольку вы используете ExternalInterface для регистрации своих сообщений, я предполагаю, что это выполняется в браузере, и у вас не запущен отладочный Flash-плеер, поэтому вы не увидитеошибки для bitmapData равны нулю, и, таким образом, один из параметров в вызове copyPixels равен нулю (что приведет к исключению, останавливающему выполнение swf).

Класс Image, который я использовалесли вы хотите проверить это (это работает на моем конце):

package  
{
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;
    import flash.net.URLStream;
    import flash.utils.ByteArray;

    public class Image extends Sprite 
    {

        private var m_loader:Loader     = null;
        private var m_bmd:BitmapData    = null;
        private var m_bytes:ByteArray   = null;
        private var m_stream:URLStream  = null;

        public function get bitmapData():BitmapData { return this.m_bmd; }

        public function Image() 
        {
            trace( "Creating a new image" );
        }

        public function loadBytes( s:String = null ):void 
        {
            trace( "Loading image '" + s + "'" );
            // FOR EASY TESTING ONLY:
            if ( s == null ) 
                s = "http://onflex.org/flexapps/applications/ProgressiveImageLoading/jpg.jpg";        

            // create URLStream with listeners
            this.m_stream = new URLStream();
            this.m_stream.addEventListener( ProgressEvent.PROGRESS, this._onStreamProgress );

            // create Loader for later
            this.m_loader = new Loader();
            this.addChild( this.m_loader );

            // create new ByteArray instance
            this.m_bytes = new ByteArray();

            // start the show!
            this.m_stream.load( new URLRequest( s ) );
        }

        private function _onStreamProgress( e:ProgressEvent):void
        {
            trace( "PROGRESS: " +  e.bytesLoaded + " of " + e.bytesTotal + " loaded!" );

            if ( this.m_stream.connected ) 
                this.m_stream.readBytes( this.m_bytes, this.m_bytes.length );

            if ( this.m_bytes.length == e.bytesTotal ) 
            {
                trace( "Image loaded!" );

                // get rid of the event listeners to avoid re-firing 
                this.m_stream.removeEventListener( ProgressEvent.PROGRESS, this._onStreamProgress ); 

                this._onStreamComplete();   
            }
        }

        private function _onStreamComplete():void
        {
            this.m_loader.contentLoaderInfo.addEventListener( Event.INIT, this._makeBitmapData );
            this.m_loader.loadBytes( this.m_bytes );

            trace( "Stream complete, loading bytes" );
        }

        private function _makeBitmapData( e:Event ):void
        {
            trace( "Making bitmap data" );

            this.m_loader.contentLoaderInfo.removeEventListener( Event.INIT, _makeBitmapData );

            // set the bitmapData for the other public methods
            this.m_bmd = new BitmapData( this.m_loader.width, this.m_loader.height );
            this.m_bmd.draw( this );

            this.dispatchEvent( new Event( Event.COMPLETE ) );
        }

    }

}

и основной класс:

package  
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
    import flash.geom.Rectangle;

    public class Main extends Sprite
    {
        private var m_image:Image = null;

        public function Main() 
        {
            this.m_image = new Image();
            this.m_image.addEventListener( Event.COMPLETE, this._onImageComplete );
            this.m_image.loadBytes();
        }

        private function _onImageComplete( e:Event ):void
        {
            this.addChild( this.m_image );

            var w:Number = 150.0;
            var h:Number = 150.0;

            var resized:BitmapData = new BitmapData( w, h );
            var cropRect:Rectangle = new Rectangle( this.m_image.width / 2 - w / 2, this.m_image.height / 2 - h / 2, w, h );

            resized.copyPixels( this.m_image.bitmapData, cropRect, new Point );

            var resizedImage:Bitmap = new Bitmap( resized );
            resizedImage.x = 450.0;
            this.addChild( resizedImage );
        }

    }

}

Это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...