Загрузка гигантских изображений во Flash - Превышение ограничений BitmapData
Я пытаюсь позволить пользователю импортировать гигантские изображения во флэш-приложение.
К сожалению, размеры объекта BitmapData не могут превышать "8,191 пикселей по ширине или высоте, а общее количество пикселей не может превышать 16,777,215 пикселей" (см. " Ссылка")
Очевидно, что с FlashPlayer11 эти ограничения исчезают - НО: поскольку я получаю только байты из FileReference, мне нужно преобразовать их через Loader.loadBytes(), чтобы получить доступ к данным изображения. Похоже, что это не работает для изображений, превышающих старые ограничения BitmapData.
У кого-нибудь есть идея, что вызывает эту проблему / как обойти?
function onAddButtonClicked(e:MouseEvent = null):void {
trace("Opening file");
_frl = new FileReferenceList();
_frl.addEventListener(Event.SELECT, onFilesSelected);
_frl.browse([new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png")]);
}
//When user has selected the files
function onFilesSelected(e:Event):void {
for each (var item:FileReference in _frl.fileList) {
item.load();
item.addEventListener(Event.COMPLETE, onFileLoaded);
}
}
//When files are loaded into the application
function onFileLoaded(e:Event):void {
trace("File Loaded!");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded);
loader.loadBytes(e.target.data);
}
//When files are finally available as Loader/Image
function onBytesLoaded(e:Event):void {
addChild((e.target as LoaderInfo).loader);
}
1 ответ
В нашем приложении с Flash Player 11.1 r102 все работает нормально. Я делаю все то же самое, что и вы, за исключением обработчика onBytesLoaded. Попробуйте это, чтобы увидеть, действительно ли растровое изображение загружается. Я тестировал с JPEG размером 12 000 x 12 000 пикселей (всего 144 000 000 пикселей), который отлично загружался (помимо того, что загружался очень медленно)
function onBytesLoaded(e:Event):void {
var ldr:Loader = Loader(e.target.loader);
var bmp:Bitmap = Bitmap(ldr.content);
trace("Bitmap Loaded: " + bmp.width + "x" + bmp.height);
var img:Image = new Image();
img.source = bmp;
addChild(img);
}