Загрузка гигантских изображений во Flash - Превышение ограничений BitmapData - PullRequest
2 голосов
/ 29 ноября 2011

Я пытаюсь разрешить пользователю импортировать гигантские изображения во флэш-приложение.

К сожалению, размеры объекта 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 Ответ

1 голос
/ 29 ноября 2011

В нашем приложении с 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);
}
...