Здравствуйте!
Мне в большом рабочем проекте необходимо показывать тумбнейлы изображений с очень большим разрешением. Больше чем 8000x8000. Я использую Flex sdk 3.4 и AIR 2.5.1. По документации у них ограничения на BitmapData
Код AS3:
В AIR 1.5 и Flash Player 10 максимальный размер объекта BitmapData составляет 8,191 пикселя в ширину или высоту, а общее количество пикселей не может превышать 16,777,215. (Т. е. если ширина объекта BitmapData составляет 8,191 пикселя, его высота не может быть больше 2 048 пикселей.)
Тумбнейлы от изображений размером 8000x8000, как ни странно, генерятся по команде image.scaleContent=true без проблем и задержек. Тумбнейлы от больших по размеру изображений не показываются. Поэтому думаю использовать класс BigAssCanvas от Keith Peters-а
http://www.bit-101.com/blog/?p=1199 .
Я сделал маленький проект чтоб посмотреть получится ли отображать огромные рисунки с помощью этого BigAssCanvas
. Итак, проблемы:
1. Рисунки обычного разрешения вплость до 8000x8000 отображаются, 10024x9352 и выше - нет.
2. В принципе, мне не нужно показывать рисунок целиком, достаточно сгенерить тумбнейл среднего размера, но я не знаю как это сделать используя BigAssCanvas, а не стандартное image.scaleContent.
Так как BigAssCanvas писался для более старой версии Flex там везде соит ограничение 2880, пробую ставить 8191 по документации - падает. Поэтому видимо и толку от этой канвы нет, но вопрос, в таком случае, какие и куда ограничения ставить?
Код AS3:
var bmp:Bitmap = new Bitmap(new BitmapData(Math.min(2880, w), Math.min(2880, h), _transparent, _color));
Привожу код пробного приложения. Там еще есть progrees bar, чтоб ждать загрузки большого изображения, но она тоже пока не работает.
Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.text.TextField;
import mx.controls.Image;
import mx.controls.ProgressBar;
import mx.controls.ProgressBarMode;
import mx.core.UIComponent;
import ui.BigCanvas;
import ui.UISprite;
private var _bmpfull:BigCanvas;
public var simpleSprite:Sprite = new Sprite();
public var _progressBar:ProgressBar = new ProgressBar();
public function Load(path:String ): void
{
var file: File = new File(path);
var img: Image = new Image();
img.addEventListener( Event.COMPLETE, onImageLoaded );
img.load( file.url );
}
public function onImageLoaded( e:Event ):void
{
var img: Image = e.target as Image;
img.scaleContent=false;
var ImageBitmap:Bitmap = (img.content as Bitmap);
_bmpfull = new BigCanvas(ImageBitmap.width, ImageBitmap.height, true, 0x00000000) ;
img.removeEventListener( Event.COMPLETE, onImageLoaded );
_bmpfull.draw(ImageBitmap);
simpleSprite.addChild(_bmpfull);
var uic:UIComponent = new UIComponent();
uic.addChild(simpleSprite);
mycanvas.addChild(uic);
uic.addEventListener(ProgressEvent.PROGRESS, progressHandler);
uic.addEventListener(Event.COMPLETE, completeHandler);
_progressBar.mode = ProgressBarMode.MANUAL;
_progressBar.percentWidth = 100;
_progressBar.setStyle("horizontalCenter", "0");
_progressBar.setStyle("verticalCenter", "0");
uic.addChild(_progressBar);
_progressBar.visible = false;
}
private function progressHandler(e:ProgressEvent):void {
_progressBar.setProgress(e.bytesLoaded,e.bytesTotal);
_progressBar.visible = e.bytesLoaded < e.bytesTotal;
}
private function completeHandler(e:Event):void {
_progressBar.visible = false;
}
]]>
</mx:Script>
<mx:Canvas id="mycanvas" height="100%" width="100%">
<mx:Button label="load images" click="{Load( 'C:/tmp/8000x8000.jpg' )}" />
</mx:Canvas>
</mx:WindowedApplication>