2011-05-07 145 views
0

在我的Flex應用程序中,我將圖像加載到Image控件中。加載圖像後,我可以應用像顏色變換或灰度等過濾器,然後我想保存與應用過濾器的圖像。我無法在應用過濾器的情況下保存圖像。使用下面的代碼,圖像可以在沒有濾鏡的情況下保存。但是,如果我使用的是如何用原始尺寸保存圖像?

finalImagedata = ImageSnapshot.captureBitmapData(myImage);

然後,圖像被保存在應用了濾鏡的位置,但是與圖像控件的維度一致。我想用原始尺寸保存圖像。要清楚的是,如果圖像是1000px X 1000px,並顯示在300px X 300px圖像控件中,則在保存時我仍然希望將圖像保存爲1000px X 1000px二維。怎麼做?我也試圖直接從像下面這樣的圖像控件內容中獲取BitmapData,但這似乎不起作用。任何幫助傢伙?

finalImagedata = Bitmap(myImage.content).bitmapData;

  var filtersArray:Array = new Array; 
      private var finalImagedata:BitmapData; 

      private function loadImage(url:String):void 
      { 
       var request:URLRequest = new URLRequest(url); 

       var imageLoader:Loader = new Loader(); 
       imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, image_completeHanlder); 
       imageLoader.load(request); 
      } 
      private function image_completeHanlder(event:Event):void 
      { 
       var bmd:BitmapData = Bitmap(event.currentTarget.content).bitmapData; 
       var bmpMy:Bitmap = new Bitmap(bmd); 
       myImage.data=bmpMy; 

      } 
      protected function button1_clickHandler(event:MouseEvent):void 
      { 
       loadImage("http://localhost/main/image.jpg"); 
      } 

      protected function prepareFinalImage():void 
      { 
       finalImagedata = new BitmapData(myImage.content.width, myImage.content.height, true); 
       finalImagedata.draw (myImage.content); 
      } 
      protected function btnSave_clickHandler(event:MouseEvent):void 
      { 
       prepareFinalImage(); 

       var encoder:Object = new Object(); 
       var defaultName:String; 

         var je:*; 
         je = new JPGEncoder(100); 
         encoder.encode = je.encode; 
         defaultName = "myImage.jpg"; 


       var imageBytes:ByteArray = encoder.encode(finalImagedata); 
       var fr:FileReference = new FileReference(); 
       fr.save(imageBytes,defaultName); 
      } 


      protected function btnGrayScale_clickHandler(event:MouseEvent):void 
      { 
       var red:Number = 0.3086; // luminance contrast value for red 
       var green:Number = 0.694; // luminance contrast value for green 
       var blue:Number = 0.0820; // luminance contrast value for blue 
       var cmf1:ColorMatrixFilter = new ColorMatrixFilter([red, green, blue, 0, 0, red, green, blue, 0, 0, red, green, blue, 0, 0, 0, 0, 0, 1, 0]); 
       filtersArray.push(cmf1); 
       myImage.filters = filtersArray; 
      } 
+0

你的意思是「如何用它保存圖像是原始尺寸」?如果沒有,那麼你應該擺脫撇號,並寫下「如何保存圖像的原始大小」,而不是 – Vivi 2011-05-08 08:00:20

回答

1

,可以儲存從Loader恢復成類成員的BitmapData:

private var bmd:BitmapData; 
[...] 
private function image_completeHanlder(event:Event):void 
{ 
    bmd = Bitmap(event.currentTarget.content).bitmapData; 
    var bmpMy:Bitmap = new Bitmap(bmd); 
    myImage.data=bmpMy; 
} 

和你prepareFinalImage方法應該依靠加載的BitmapData:

protected function prepareFinalImage():void 
{ 
    finalImagedata = new BitmapData(bmd.width, bmd.height, true); 
    if (myImage.filters.length > 0) 
     finalImagedata.applyFilter(bmd, 
      new Rectangle(0, 0, bmd.width, bmd.height), 
      new Point(0,0), myImage.filters[0] as BitmapFilter); 
    if (myImage.filters.length > 1) 
     for (var i:int = 1; i < myImage.filters.length; i++) 
     { 
      finalImagedata.applyFilter(finalImagedata, 
       new Rectangle(0, 0, bmd.width, bmd.height), 
       new Point(0,0), myImage.filters[i] as BitmapFilter); 
     } 
} 

這你可以在BitmapData上應用過濾器規模爲DisplayObject

+0

我可能做錯了什麼,但我不斷收到錯誤「TypeError:Error#2007:Parameter filterObject must be non-空值。」當我打電話給prepareFinalImage。即使過濾器已被應用。 – redGREENblue 2011-05-08 11:14:30

+0

您應該檢查是否將'myImage.filters [i]'轉換爲BitmapFilter'爲'null'。當然,應用精確的過濾器會更好,以便將它們放入「myImage.filters」數組中。 – rekaszeru 2011-05-08 11:22:38

+0

這可能是問題所在。演員表返回null。我找到的解決方法是直接將過濾器應用於加載器加載的bitmapdata對象,然後在Image控件中顯示該對象。這樣,當我想保存最終圖像時,我可以使用該位圖數據進行保存。不過,我不確定這是否正確。 – redGREENblue 2011-05-08 12:11:32