RangeError: Error #1506: The specified range is invalid.

2011年10月8日 01:00 action script — littlepad

Alchemy 製の JPEG エンコーダーが激速でウヒョー!と喜んで使っていたのだけど、
いつからかこんなエラーが出てくるようになった。

RangeError: Error #1506: The specified range is invalid.
at cmodule.aircall::FSM_imalloc$/start()
at cmodule.aircall::FSM_pubrealloc/work()
at Function/()
at Function/()
at Function/()[C:\Users\littepad\hoge\hoge.as:122]

その時のソースはこんな感じ。
BitmapData を格納した配列をループでエンコード処理をしてる。

import cmodule.aircall.CLibInit;

for each(var bmd:BitmapData in bmdArray){
	// alchemy jpeg encoder
	var jpeginit:CLibInit = new CLibInit();
	var jpeglib:Object = jpeginit.init();
	var imgData:ByteArray = bmd.getPixels(bmd.rect);
	var imgEncoded:ByteArray = new ByteArray();
	imgData.position = 0;
	jpeglib.encode(imgData, imgEncoded, bmd.width, bmd.height, 75);
}


調べてみると、C ライブラリは 1 回以上イニシャライズしてはいけないらしい。
ということで、ライブラリのインスタンスが null だった場合のみ初期化するように変更してみた。

import cmodule.aircall.CLibInit;

for each(var bmd:BitmapData in bmdArray){
	// alchemy jpeg encoder
	var jpeginit:CLibInit; 
	var jpeglib:Object;
	if (jpeglib == null) {
	    jpeginit = new CLibInit;
	    jpeglib = jpeginit.init();
	}
	var imgData:ByteArray = bmd.getPixels(bmd.rect);
	var imgEncoded:ByteArray = new ByteArray();
	imgData.position = 0;
	jpeglib.encode(imgData, imgEncoded, bmd.width, bmd.height, 75);
}

が、それでもうまくいかないので、プライベート変数にしてやったら…。
うまくいった!

import cmodule.aircall.CLibInit;

private var _jpeginit:CLibInit;
private var _jpeglib:Object;

// コンストラクタとかでイニシャライズ
_jpeginit = new CLibInit();
_jpeglib = _jpeginit.init();

for each(var bmd:BitmapData in bmdArray){
	// alchemy jpeg encoder
	var imgData:ByteArray = bmd.getPixels(bmd.rect);
	var imgEncoded:ByteArray = new ByteArray();
	imgData.position = 0;
	_jpeglib.encode(imgData, imgEncoded, bmd.width, bmd.height, 75);
}

コメントはまだありません

No comments yet.

TrackBack URL

Leave a comment

about

ハンドルネーム:littlepad
都内で WEB 制作(デザイン, html/css, Flash, MT, WordPress etc)をしているBOØWY研究家

category:

search:


archives:

GO TO PAGETOP