RangeError: Error #1506: The specified range is invalid.
2011年10月8日 01:00
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);
}
カテゴリー: programming
Leave a comment
コメントはまだありません
No comments yet.