2010-08-09 52 views

回答

8

使用loadBytes()將fileReference.data加載到加載程序中。然後你將有:sourceBMP:Bitmap = loader.content作爲位圖;

這裏是一個示例代碼:

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

謝謝Andi! 我不知道這種技術會爲應用程序增加多少開銷。 但優秀的答案。謝謝! – Francisc 2010-08-29 17:36:46

+0

我看到您選擇了不同的解決方案,將圖像添加到顯示列表中。從8月10日你的評論中,我以爲你不想那麼做。 – andi 2011-10-19 13:40:40

+0

確實。我沒有看到下面的MXML部分:''。在想'image'只是一個沒有添加到舞臺上的AS變量。 – Francisc 2011-10-20 10:55:36

1

從Flex的上下文中,我非常肯定,你從瀏覽器返回結果,它只是一個byteArray。理論上,如果您使用該byteArray作爲圖像標籤的源代碼,那麼只要將該圖像添加到容器中,您就可以獲得高度和寬度。

否則,我不認爲有一種簡單的方法可以使用Flex從本地文件獲取這樣的元數據信息。

+0

這是一個ByteArray,是的。我想過以編程方式創建一個Image對象,但擔心這樣做的開銷。 你是說即使我這樣做,我不得不使用addChild來測量它的內容的dimmensions?我不關心容器的大小,只是所選圖片的寬度和高度。 謝謝! – Francisc 2010-08-10 11:01:57

+1

是的,可能會有開銷創建圖像對象。我相信,只有使用AddChild方法將圖像添加到父級後,圖像纔會被測量,因此高度和寬度將爲零,除非您明確設置。 – JeffryHouser 2010-08-10 12:48:49

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>