13

これは、画像を .csv ファイルに保存するために使用する私のコードですBitmap。このコードは、CyanogenMod のカメラ アプリのコードに基づいているため、適切に動作すると思いますが、違います。この問題に関する最も重要な点は、Nexus 4 でテストしたところBitmap、背面カメラで撮影した写真は適切に作成されていましたが、前面カメラを使用すると、以下のような結果になったことです。

を作成するために使用しているコードBitmap:

private class XyzPictureCallback implements Camera.PictureCallback {

    @Override
    public void onPictureTaken (byte [] data, Camera camera) {
        Options options = new Options();
        options.inDither = false;
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;

        Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length, options);
    }
}

別のものを使用してみOptionsましたが(まったく使用しませんでした)、役に立ちませんでした。2つの異なるカメラから返されたピクセル形式のものかもしれませんが、実行getSupportedPictureFormats()すると両方とも返されましたImageFormat.JPEG...

アイデアが尽きた…

dataを使用して を直接保存FileOutputStreamすると、適切な JPEG 画像が作成されたことにも言及する必要があります。したがって、問題は とBitmapFactoryの作成方法にあるに違いありませんBitmap

これは、このコードが生成するビットマップです。

壊れた画像

編集 (24.03.2013):

これを修正するために何時間も費やした後でも、これに対する実際の解決策はまだありません。私が見つけたのは、画像サイズを(を使用してCamera.Parameters.setPictureSize(int width, int height))呼び出して取得した前面カメラで利用可能な最高の解像度に設定した場合にのみ問題が発生することCamera.Parameters.getSupportedPictureSizes()です。

問題の原因となっている解像度は 1280x960 です。前述したように、これは最高の解像度です。2 番目に高いのは 1280x720 で、これを使用すると出力画像は問題ありません。カメラが吐き出すフォーマットを確認しましたが、それは常に ImageFormat.JPEG であるため、ここではピクセルフォーマットが問題ではないと思います...

編集 (2013 年 8 月 3 日): takePicture への呼び出し:

private class XyzAutoFocusCallback implements Camera.AutoFocusCallback {

            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                    if (takingPicture) {
                            camera.takePicture(null, null, myPictureCallback);
                    } else {
                    ...
            }

}
4

7 に答える 7

3

高さと幅は、そのカメラではサポートされていません。それがそのように見える理由であり、1280x720 設定が機能する理由です。これは、スタークラフトをモニターでサポートされていない解像度で実行するように設定した場合と同じです。

于 2013-03-30T18:03:15.830 に答える
0

FileOutputStream を使用してデータを直接保存すると、適切な JPEG 画像が作成されることにも言及する必要があります。したがって、問題は BitmapFactory と Bitmap の作成方法にあるはずです。

カメラは完全に処理された JPEG データを出力し (うまくいけば)、ディスクに書き込むことができます。今あなたが試すべきこと:

  1. ファイルをディスクにダンプします。
  2. 検証ツールまたは PC 上の画像エディタを使用して、そのファイルを確認します。
  3. Image Editor で画像が正常に開く場合は、標準の JPEG プロファイルを使用して、その Image Editor からコピーを保存します。
  4. BitmapFactory元のファイルとイメージ エディターで保存したファイルを処理し、両方でビットマップが正しくないかどうかを確認します。

画像が有効な JPEG であり、BitmapFactory依然として間違ったビットマップを生成するBitmapFactory場合、問題はカメラにあり (可能性は低い)、カメラによるファイル出力が無効な JPEG である場合、問題はカメラにある (可能性が高い)。

于 2013-03-31T07:09:57.063 に答える
0

これを試して

Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
imv.setImageBitmap(bmp);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 70, bos);
于 2013-03-14T08:48:07.687 に答える
0

Options に null を入れようとしましたか? それを試してください:

@Override
public void onPictureTaken(final byte[] data, Camera camera) {
    Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length, null);
    try {
        FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"/image.jpg");
        bm.compress(Bitmap.CompressFormat.JPEG, 95, out);
        out.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
于 2013-03-28T18:24:58.973 に答える