6

私はバイト配列を取得し、そこから別の配列にコピーしようとしましたonPreviewFrame()。だから私はカメラと新しいバイト配列を準備します

        try {
        if (cam != null) {

            Camera.Parameters parameters = cam.getParameters();
            parameters.setPreviewFrameRate(25);
            parameters.setPictureFormat(ImageFormat.JPEG);
            cam.setParameters(parameters);
            cam.setPreviewDisplay(holder);
            cam.startPreview();

            arr = new byte[(parameters.getPreviewSize().height)
                    * (parameters.getPreviewSize().width)];

            Log.i("" + parameters.getPictureSize().height, "   "
                    + parameters.getPictureSize().width);


        }
    } catch (IOException e) {
        Log.d("CAMERA", e.getMessage());
    }

ログは私に教えてくれます:

480 640

そうarr.length = 307200

しかし:

public void onPreviewFrame(byte[] data, Camera camera) {    
    Log.i(arr.length+" ",data.length+"");
}

arr.length = 307200 (もちろん、これはフレーム サイズ = 640*480 を意味します)

しかし data.length = 460800 (そしてそれはフレームサイズ= 800 * 576を意味します)

そして、データを Arr にコピーしてからSystem.arraycopy(data, 0, arr, 0, arr.length);画像をエクスポートしようとすると:

FileOutputStream outStream = null;
    try {
        outStream = new FileOutputStream("/sdcard/new.jpg");

        Camera.Parameters parameters = cam.getParameters();
        Size size = parameters.getPreviewSize();

        YuvImage image = new YuvImage(arr, parameters.getPreviewFormat(),
                size.width, size.height, null);
        image.compressToJpeg(
                new Rect(0, 0, image.getWidth(), image.getHeight()), 90,
                outStream);

        outStream.flush();
        outStream.close();
    } catch (FileNotFoundException e) {
        Log.d("CAMERA", e.getMessage());
    } catch (IOException e) {
        Log.d("CAMERA", e.getMessage());
    }

画像が緑色になる:

ここに画像の説明を入力

では、データ配列を 640*480 にするにはどうすればよいでしょうか? または、(たとえば) Bitmap から単一の行を取得し、それを別の Bitmap に追加する別の方法を知っているでしょうか?

4

1 に答える 1

5

正しい配列サイズは次のとおりです new byte[previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())) / 8];(フォーマットによってピクセルあたりのビット数が異なります。ImageFormat.getBitsPerPixelで取得します) 。

于 2012-10-20T21:01:26.620 に答える