2012-05-02 26 views
3

Android Flash Mobile Appの場合、カメラからプレビューフレームを取得しようとします。FREBitmapDataを編集できません

残念ながら、カメラがsetMode()(UIがフリーズしているために受け入れられない)を呼び出さない限り、カメラはフォーカスしていないため、AIR組み込みカメラクラスは使用できません。

だから私はこれのネイティブ拡張を書くことにしました。拡張機能自体が動作しています(NativeCamera.pixelsで適切なImageデータを取得します)が、FREBitmapDataを使用してフレームを送信することはできません。 ActionScript側では、BitmapDataは正しい次元を持ちますが、黒のままです。

私のJava-コード

package com.jumptomorrow.nativecamera; 

import java.nio.ByteBuffer; 

import com.adobe.fre.FREBitmapData; 
import com.adobe.fre.FREContext; 
import com.adobe.fre.FREFunction; 
import com.adobe.fre.FREObject; 

public class NativeCameraGrabFrameFunction implements FREFunction { 

    @Override 
    public FREObject call(FREContext context, FREObject[] object) { 
     try { 
      FREBitmapData out = null; 

      try { 
       out = FREBitmapData.newBitmapData(NativeCamera.size.width, NativeCamera.size.height, false, new Byte[]{0xf,0xf,0x0,0x0}); 
       out.acquire(); 
       ByteBuffer bb = out.getBits(); 
       bb = ByteBuffer.wrap(NativeCamera.pixels); 
       out.invalidateRect(0, 0, NativeCamera.size.width, NativeCamera.size.height); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      try { 
       out.release(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 

      return out; 

     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

} 

私のActionScriptコード

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.Event; 
    import flash.utils.ByteArray; 

    import net.hires.debug.Stats; 

    public class camera_test extends Sprite 
    { 
     private var nc:NativeCameraInterface; 
     private var bitmap:Bitmap; 

     public function camera_test() 
     { 
      super(); 

      // support autoOrients 
      stage.align = StageAlign.TOP_LEFT; 
      stage.scaleMode = StageScaleMode.NO_SCALE; 

      nc = new NativeCameraInterface(); 
      try { 
       nc.startCamera(); 
      } 
      catch(e:Error) { 
       trace(e.getStackTrace()); 
      } 

      addEventListener(Event.ENTER_FRAME, onEnterFrame); 
     } 

     protected function onEnterFrame(event:Event):void 
     { 
      if(nc) { 
       var bmpd:BitmapData = nc.getFrame() as BitmapData; 

       try { 
        var bmp:Bitmap = new Bitmap(bmpd); 

        addChild(bmp); 
        bmp.scaleX = bmp.scaleY = 2; 

       } catch(e:Error) { 
        trace("failed"); 
       } 
      } 
     } 
    } 
} 

は、誰もこれが何ができるか考えていますか?

答えて

1

はこのようなものになる...これらの行...

ByteBuffer bb = out.getBits(); 
bb = ByteBuffer.wrap(NativeCamera.pixels); 

べきではないのですか?

ByteBuffer bb = out.getBits(); // (no change) 
bb.position(0); 
bb.put(ByteBuffer.wrap(NativeCamera.pixels)); 

これは代わりbb = ByteBuffer.wrap(...)を通して新しいByteBufferインスタンスを作成する、out.getBits()により得られByteBufferインスタンスを修正します。

+0

yup。それはそれを作った。ありがとうございました – flecki89

関連する問題