2011-09-19 76 views
1

有没有人在flashbuilder中成功使用过这种编码器4.5.1? 我得到这个错误?通常在装载第二张照片。任何帮助表示赞赏。jpegencoder.swc from http://last.instinct.se/graphics-and-effects/using-the-fast-asynchronous-alchemy-jpeg-encoder-in-flash/640

RangeError: Error #1506: The specified range is invalid. 
at cmodule.aircall::FSM_imalloc$/start() 
at cmodule.aircall::FSM_pubrealloc/work() 
at cmodule.aircall::CRunner/work() 
at Function/<anonymous>() 
at flash.utils::Timer/_timerDispatch() 
at flash.utils::Timer/tick() 

我的代码如下:

private var im:img; 
private var jpgStream:ByteArray; 
private var jpeglib:Object; 
private var jpeginit:CLibInit = new CLibInit(); // get library 

public function save_image(_im:img, pg:Number):void 
{ 
    var bm:BitmapData = Bitmap(_im.getChildAt(0)).bitmapData; 
    im = _im; 

    var imgData:ByteArray = bm.getPixels(bm.rect); 
    jpgStream = new ByteArray(); 
    imgData.position = 0; 

    trace(bm == null); 
    var jpegQuality:Number = 40; 

    if (!jpeglib) { 
      jpeglib=jpeginit.init(); 
    } 
    jpeglib.encodeAsync(encodeComplete, imgData, jpgStream, bm.width, bm.height, jpegQuality); 
} 

private function encodeComplete(e:Event):void { 
    trace("Encoding complete"); 

    file = File.documentsDirectory.resolvePath("Pic-A-Note/" + albumName + "/object_layer_" + im.name + ".pn"); 
    fs.open(file, FileMode.WRITE); 
    fs.writeBytes(jpgStream,0); 
    fs.close(); 
} 

回答

2

问题是您正在初始化两次CLibInit。我创建了一个自定义类来处理使用jpegencoder.swc透明地对jpg进行编码,就像处理本地类一样。

public class JPGAlchemyEncoder { 

    private static var alchemyWrapper:Object; 
    private var quality:Number; 

    public function JPGAlchemyEncoder(quality:Number) { 
     this.quality = quality; 
     if (!alchemyWrapper){ 
      var loader:CLibInit = new CLibInit; 
      alchemyWrapper = loader.init(); 
     } 
    } 

    public function encode(bitmapData:BitmapData):ByteArray{ 
     var data: ByteArray = bitmapData.clone().getPixels(bitmapData.rect); 
     data.position = 0; 
     return alchemyWrapper.write_jpeg_file(data, bitmapData.width, bitmapData.height, 3, 2, quality); 
    } 

    public function encodeAsync(bitmapData:BitmapData, completeHandler:Function):void{ 
     var encodedData:ByteArray = new ByteArray(); 
     var data: ByteArray = bitmapData.clone().getPixels(bitmapData.rect); 
     data.position = 0; 
     var encodeComplete:Function = function():void{ 
      completeHandler(encodedData); 
     }; 
     alchemyWrapper.encodeAsync(encodeComplete, data, encodedData, bitmapData.width, bitmapData.height, quality); 
    } 
} 
} 

检查构造函数如何处理静态CLib。这样,您可以根据需要启动尽可能多的JPGAlchemyEncoder,但CLib只会初始化一次,解决您的问题。

+0

啊,这很有道理。尽管我现在自己得出这个结论,但我仍然认为这对于那些可能会遇到这个问题的人来说是一个有用的职位。谢谢 – Tw1tCh

1

没有用过深港西部通道,但在的as3corelib非炼金术JPEG编码器将做的工作一样好(没有任何错误,我可能会添加) http://code.google.com/p/as3corelib/