Хорошо, взяв код, который вы вставили на 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 );
}
}
}
Это исправить?