2010-08-09 7 views

ответ

8

Загрузите файлReference.data в загрузчик, используя loadBytes(). Тогда у вас будет: sourceBMP: Bitmap = loader.content как Bitmap;

Вот пример кода:

MXML часть:

<fx:Declarations> 
    <net:FileReference id="fileReference" 
     select="fileReference_select(event);" 
     complete="fileReference_complete(event);" /> 
</fx:Declarations> 
<s:Button id="uplaodImageBtn" 
    label="Upload Image" 
    click="uplaodImageBtn_clickHandler()"/> 

AS3 часть:

private function uplaodImageBtn_clickHandler() : void { 
    var arr:Array = []; 
    arr.push(new FileFilter("Images", ".gif;*.jpeg;*.jpg;*.png")); 
    fileReference.browse(arr); 
} 

private function fileReference_select(evt:Event):void { 
    fileReference.load(); 
} 

private function fileReference_complete(event:Event):void { 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete); 
    loader.loadBytes(fileReference.data); 
} 

public function loader_complete (event:Event) : void { 
    var sourceBMP:Bitmap = event.currentTarget.loader.content as Bitmap; 
    Alert.show(sourceBMP.width + ', ' +sourceBMP.height); 
} 
+0

Спасибо, Анди! Интересно, сколько накладных расходов такая техника могла бы добавить к приложению. Но отличный ответ. Благодаря! – Francisc

+0

Я вижу, что вы выбрали другое решение, которое добавляет изображение в список отображения. Из вашего комментария 10 августа я думал, что вы не хотите этого делать. – andi

+0

Действительно. Я не видел часть MXML ниже: ''. Думал, что «образ» был просто переменной AS, которая не была добавлена ​​на сцену. – Francisc

1

Из контекста Flex я уверен, что если вы вернете результаты из браузера, это будет только byteArray. Теоретически, если вы используете этот byteArray в качестве источника для тега изображения, вы сможете получить высоту и ширину таким образом, как только вы добавите это изображение в контейнер.

В противном случае, я не верю, что есть простой способ получить такую ​​информацию метаданных из локальных файлов с помощью Flex.

+0

Это ByteArray, да. Я думал о создании объекта изображения программно, но беспокоился о накладных расходах на это. Вы говорите, что даже если я это сделаю, я должен использовать addChild, чтобы иметь возможность измерять уменьшенные размеры контента? Меня не интересует размер контейнера, просто ширина и высота выбранного изображения. Спасибо! – Francisc

+1

Да, возможно, накладные расходы создают объект изображения. Я верю, что изображение не будет измерено до тех пор, пока оно не будет добавлено к его родительскому методу AddChild, поэтому высота и ширина будут равны нулю, если вы не установите их явно. – JeffryHouser

1

Вы должны быть в состоянии прочитать image.sourceWidth и image.sourceHeight, если вы подождите, пока свойство исходного изображения будет обновлено. Это даст вам незамасленные исходные значения.

<fx:Script> 
    <![CDATA[ 

     import mx.events.FlexEvent;  

     private function browseImage(event:MouseEvent):void { 
      var arr:Array = []; 
      arr.push(new FileFilter("Images", ".gif;*.jpeg;*.jpg;*.png")); 
      imageFileReference.browse(arr);   
     } 

     private function imageSelect(evt:Event):void { 
      imageFileReference.load(); 
     } 

     private function imageComplete(evt:Event):void { 
      image.source = smallImageFileReference.data; 
      image.addEventListener(FlexEvent.UPDATE_COMPLETE, getImageSize);     
     } 

     private function getImageSize(evt:FlexEvent):void { 
      image.removeEventListener(FlexEvent.UPDATE_COMPLETE, getImageSize);   
      imageWidth.text = image.sourceWidth + "px"; 
      imageHeight.text = image.sourceHeight + "px"; 
     } 
    ]]> 

</fx:Script> 

<fx:Declarations> 
    <net:FileReference id="imageFileReference" 
     select="imageSelect(event)" 
     complete="imageComplete(event)"/> 
</fx:Declarations> 

<s:VGroup width="100%" height="100%"> 

    <s:HGroup width="100%" verticalAlign="middle"> 
     <s:Label fontWeight="bold" text="Width:" /> 
     <mx:Text id="imageWidth" /> 
    </s:HGroup> 

    <s:HGroup width="100%" verticalAlign="middle"> 
     <s:Label fontWeight="bold" text="Height:" /> 
     <mx:Text id="imageHeight" /> 
    </s:HGroup> 

    <s:Image id="image" maxHeight="200" maxWidth="200" /> 
    <s:Button label="Browse for Image" click="browseImage(event)" /> 

</s:VGroup>