2

だから私は、このカメラのプレビューをとCameraで設定しました。また、カメラ画像の修正版を配置する場所もあり、これを毎秒 1 回更新したいと考えています。SurfaceViewSurfaceHolderImageView

「res」から画像を読み込むと、すべてのコードの準備が整い、すでに機能していますが、カメラから画像データを読み取るのに非常に苦労しています。

私はすでに次のことを試しました:

  1. intentforを作成し、小さなサムネイルMediaStore.ACTION_IMAGE_CAPTUREの取得を開始します (実際には十分です) 。問題は、これによりカメラ アプリが開き、「手動で」写真を撮る必要があることですonActivityResult(Bitmap)data.getExtras().get("data")

  2. を作成しCamera.PreviewCallback、 を取得しYuvImage、 を使用してイメージに変換しYuvImage.compressToJpeg(...)ます。

    ここでの問題は、いつどこに Camera.setPreviewCallbackWithBuffer(PreviewCallback).

  3. PreviewHolderを使用してキャンバスにロックインし、lockCanvas()それをビットマップに変換しようとすることで、データを直接取得しようとし

    ます明らかに機能しません。

編集: これを機能させる最良の方法は何ですか? QR コード リーダーは、カメラから画像データを連続して読み取る必要がありますが、どのように機能するのですか?

4

1 に答える 1

5

オプション番号2を選択し、最終的に機能させました。

@Overrideこのコールバックを使用しましたが、以前は忘れていました

private Camera.PreviewCallback  previewCallback= new Camera.PreviewCallback()
{   
    @Override
    public void onPreviewFrame(byte[] data,Camera cam)
    {
            Camera.Size previewSize = cam.getParameters().getPreviewSize();
            YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21,previewSize.width,previewSize.height, null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            yuvImage.compressToJpeg(new Rect(0,0,previewSize.width,previewSize.height),80,baos);
            byte[] jdata = baos.toByteArray();
            Bitmap bitmap = BitmapFactory.decodeByteArray(jdata,0,jdata.length);    
    }
};

そして、setPreviewCallbackではなく使用してそれを開始しますsetPreviewCallbackWithBuffer

SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() 
{   
    public void surfaceCreated(SurfaceHolder holder) {

        camera.setPreviewCallback(previewCallback);
    }
}
于 2013-11-21T00:31:06.597 に答える