2010-09-17 47 views
0

我創造這個「繪圖應用程序」,用戶可以點擊「預覽」,它會帶他們做了什麼,畫一個位圖,然後我想該位圖分成兩個位圖時左和右圖像。我創建第一個位圖,將其編碼爲JPEG,然後使用它來使用副本像素左右切割。然後,我在一幅畫布中將圖像與空間一起改造,然後繪製該畫布。在那裏一切工作正常。的Flex,問題jpegencoding序列

當我去編碼新的位圖,然後提供它來保存,保存的圖像是空白的。到目前爲止,我已經測試過一切,並且一切正常。我在屏幕上看到了圖像,我可以將第一個位圖保存爲好..但第二個位置總是空白。這裏有一些示例代碼,可能有人可以幫助我。

_mainBmd = new BitmapData(_jacketWidth, _jacketHeight); 
_mainBmd.draw(_imageHolder); 
startEncode(_mainBmd); 


private function startEncode(imageBitmapData:BitmapData):void 
     { 
      var encoder:JPEGAsyncEncoder = new JPEGAsyncEncoder(100); 
      encoder.PixelsPerIteration = 150; 
      encoder.addEventListener(JPEGAsyncCompleteEvent.JPEGASYNC_COMPLETE, encodeDone); 

      encoder.encode(imageBitmapData); 


     } 

private function encodeDone(event:JPEGAsyncCompleteEvent):void 
     { 

_leftBmd = new BitmapData(sideWidth, sideHeight); 
      var lRect:Rectangle = new Rectangle(0,0, sideWidth, sideHeight); 
      var lPoint:Point = new Point(0,0); 
      _leftBmd.copyPixels(_mainBmd, lRect, lPoint); 


      _rightBmd = new BitmapData(sideWidth, sideHeight); 
      var bWidth:Number = 200; 
      var sWidth:Number = 111; 
      var rRectWidth:Number = (bWidth/2 + sWidth) * Constants.print_dpi; 
      var rRect:Rectangle = new Rectangle(rRectWidth, 0, sideWidth, sideHeight); 
      var rPoint:Point = new Point(0, 0); 
      _rightBmd.copyPixels(_mainBmd, rRect, rPoint); 

var lbm:Bitmap = new Bitmap(_leftBmd); 
      var rbm:Bitmap = new Bitmap(_rightBmd); 

      //now combine the two images into one holder with a space in the middle 


      //left Image 
      var l_Image:Image = new Image(); 
      l_Image.source = lbm; 

      //right image 
      var r_Image:Image = new Image(); 
      r_Image.source = rbm; 

var newRender:Canvas = new Canvas(); 
      newRender.clipContent = false; 
      newRender.minHeight = 0; 
      newRender.minWidth = 0; 

      newRender.addChild(l_Image); 
      r_Image.x = 500; 
      newRender.addChild(r_Image); 

fcBMD = new BitmapData(renderW, renderH); 
      fcBMD.draw(newRender); 

startEncode2(fcBMD); 


} 

private function startEncode2(imageBitmapData:BitmapData):void 
     { 
      var encoder:JPEGAsyncEncoder = new JPEGAsyncEncoder(100); 
      encoder.PixelsPerIteration = 150; 
      encoder.addEventListener(JPEGAsyncCompleteEvent.JPEGASYNC_COMPLETE, encode2Done); 

      encoder.encode(imageBitmapData); 


     } 

private function encode2Done(event:JPEGAsyncCompleteEvent):void 
     { 
      _data = event.ImageData; 


     } 

private function onSaveRenderClick(e:MouseEvent):void //save button listener 
     { 
      var fileRef:FileReference = new FileReference(); 
      fileRef.addEventListener(Event.SELECT, onSaveComplete); 
      fileRef.save(_data, 'testImage.jpg'); 
     } 

回答

0

是否有特殊的理由,爲什麼你走線槽創建一個帆布架和添加圖像的所有的循環?

爲什麼不直接在要編碼的最後的BitmapData使用copyPixels:

var backgroundColor:uint = 0xffffff; 
fcBMD = new BitmapData(renderW, renderH, false, backgroundColor); 

var lPoint:Point = new Point(0,0); 
var lRect:Rectangle = new Rectangle(0,0, sideWidth, sideHeight); 
fcBMD.copyPixels(_mainBmd, lRect, lPoint); 

var rRect:Rectangle = new Rectangle(rRectWidth, 0, sideWidth, sideHeight); 
var rPoint:Point = new Point(renderW - sideWidth, 0); 
fcBMD.copyPixels(_mainBmd, rRect, rPoint); 

startEncode2(fcBMD); 
+0

這是主要用於測試。我需要查看每個步驟的輸出以確保圖像正確排列。起初我並沒有這樣做,但是當我沒有得到任何輸出時,我想我會將它們添加到畫布上,以便我可以確保它正確地創建這些圖像。這是...但編碼後仍然沒有輸出。我可以對_mainBmd進行編碼,這很有效,而不是從中創建的第二個圖像。 – pfunc 2010-09-18 22:39:01

+0

我拿出了所有的測試循環,並根據上述建議簡化了代碼,現在它正在工作。我仍然不知道以前出了什麼問題,因爲我看到我想在舞臺上創作的圖像,它只是無法導出..但感謝您的幫助。 – pfunc 2010-09-18 22:47:03