jpegencoder.swc от http://last.instinct.se/graphics-and-effects/using-the-fast-asynchronous-alchemy-jpeg-encoder-in-flash/640 - PullRequest
1 голос
/ 19 сентября 2011

Кто-нибудь успешно использовал этот кодировщик во flashbuilder 4.5.1? Я получаю эту ошибку ??? обычно при загрузке второй картинки. любая помощь приветствуется.

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 ]

2 голосов
/ 06 сентября 2012

Проблема в том, что вы инициализируете CLibInit дважды. Я создал собственный класс для прозрачной обработки кода jpg, используя jpegencoder.swc, как вы делаете это с собственным классом.

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 будет инициализирован только один раз, решая вашу проблему.

1 голос
/ 20 сентября 2011

Я не использовал этот swc, но неалхимический jpeg-кодировщик в AS3Corelib будет выполнять эту работу точно так же (без каких-либо ошибок, я мог бы добавить) http://code.google.com/p/as3corelib/

...