2016-12-18 6 views
0

私のアプリケーションでは、ユーザーが画像をキャプチャしようとする前にカメラのフレームをキャプチャするようにカメラを起動するとすぐに、画像をバッファに保存したいと思います。アンドロイドでこれを達成するための具体的な方法を教えてください。私のアプリカメラがアンドロイドで起動している間、画像をバッファに保存する方法は?

答えて

0

古いカメラAPIでは、比較的簡単なプレビューフレームデータにアクセスできます。Android 5.0から、camera2が導入されました。これは、正しいハンドラと状態を設定するのがはるかに複雑です。

Android 7.0がリリースされました。主な質問は次のとおりです。旧式の非難されたコードを使用してもいいですか?私たちのAndroid携帯電話のいくつかはまだ4.2と4.4を使用しているので、私にとっては5.0aと6.0はうまくいきますが、私はあなたの事を知らないのです。

緑色の画面を削除するようなカスタム色を削除しましたが、ユーザーがプレビュー画面にタッチすると、茶色や青色のような希望の色が選択されます。

camera.setPreviewCallback(new CameraPreviewCallback()); 

そして、このように初期化されたカメラ:

private class CameraPreviewCallback implements Camera.PreviewCallback { 

    private int curColor, curRed, curGreen, curBlue; 

    @Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 

     // conversion: 
     decodeYUV420SP(mRgb, data, mSurfWidth, mSurfHeight); 

     // check if need an update for the selected color 
     if (mRequestColorUpdate) { 
      int arrayIndex = mTouchY * mSurfWidth + mTouchX; 
      mChoosedColor = mRgb[arrayIndex]; 
      btRecordVideo.setBackgroundColor(mChoosedColor); 
      mRequestColorUpdate = false; 
      updateBackgroundRemovalLimits(); 

      // do my stuff, not important here 
     } 
     // remove background: 
     for (int i = 0; i < mRgb.length; i++) { 
      curColor = mRgb[i]; 
      // split: 
      curRed = Color.red(curColor); 
      curGreen = Color.green(curColor); 
      curBlue = Color.blue(curColor); 

      if ((minRed <= curRed) && (curRed <= maxRed) && (minGreen <= curGreen) && (curGreen <= maxGreen) && (minBlue <= curBlue) && (curBlue <= maxBlue)) { 
       // set alpha to 0 bitwise: 
       mRgb[i] = curColor & 0x00FFFFFF; 
      } 
     } 

     // update the modified preview screen: 
     mBitmap.setPixels(mRgb, 0, mSurfWidth, 0, 0, mSurfWidth, mSurfHeight); 
     if (ivPreviewModified != null) { 
      ivPreviewModified.setImageBitmap(mBitmap); 
     } 
    } 
} 

あなたはカメラに追加する必要が

@Override 
public void onResume() { 
    super.onResume(); 
    // 
    camera = Camera.open(); 
    startPreview(); 
} 

そして、これはstackoverflowの:)

public class YuvToRgb { 

    // Byte decoder : --------------------------------------------------------------------- 
    public static final void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) { 
     // Pulled directly from: 
     // http://ketai.googlecode.com/svn/trunk/ketai/src/edu/uic/ketai/inputService/KetaiCamera.java 
     final int frameSize = width * height; 

     for (int j = 0, yp = 0; j < height; j++) { 
      int uvp = frameSize + (j >> 1) * width, u = 0, v = 0; 
      for (int i = 0; i < width; i++, yp++) { 
       int y = (0xff & ((int) yuv420sp[yp])) - 16; 
       if (y < 0) 
        y = 0; 
       if ((i & 1) == 0) { 
        v = (0xff & yuv420sp[uvp++]) - 128; 
        u = (0xff & yuv420sp[uvp++]) - 128; 
       } 

       int y1192 = 1192 * y; 
       int r = (y1192 + 1634 * v); 
       int g = (y1192 - 833 * v - 400 * u); 
       int b = (y1192 + 2066 * u); 

       if (r < 0) 
        r = 0; 
       else if (r > 262143) 
        r = 262143; 
       if (g < 0) 
        g = 0; 
       else if (g > 262143) 
        g = 262143; 
       if (b < 0) 
        b = 0; 
       else if (b > 262143) 
        b = 262143; 

       rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff); 
      } 
     } 
    } 
} 
からです
関連する問題