3

ユーザーがボタンをクリックしたときにカメラから JPEG スナップショットを保存する Android アプリケーションを作成しています。残念ながら、保存している JPEG ファイルを見ると、コードが壊れているように見えます。parameters.setPreviewSize への呼び出しが原因のようです (以下のコード スニペットを参照)。それを削除すると、画像は正常に保存されます。ただし、それがないとプレビューサイズを設定できず、setDisplayOrientationもそれなしでは効果がないようです。

私のアプリは API レベル 8 (Android 2.2) をターゲットにしており、HTC Desire HD でデバッグしています。ここで何が間違っているのかよくわかりません...どんな助けでも大歓迎です!

乾杯、スコッティ

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = mCamera.getParameters();        
    Camera.Size size = getBestPreviewSize(w,h);

    // This next call is required in order for preview size to be set and
    // setDisplayOrientation to take effect...
    // Unfortunately it's also causing JPEG to be created wrong
    parameters.setPreviewSize(size.width, size.height);

    parameters.setPictureFormat(ImageFormat.JPEG);
    mCamera.setParameters(parameters);
    mCamera.setDisplayOrientation(90);

    mCamera.startPreview();

}

// This is the snapshot button event handler
public void onSnapshotButtonClick(View target) {
    //void android.hardware.Camera.takePicture(ShutterCallback shutter, 
    //                              PictureCallback raw, PictureCallback jpeg)
    mPreview.mCamera.takePicture(null, null, mPictureCallback);
}


// This saves the camera snapshot as a JPEG file on the SD card
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] imageData, Camera c) {

        if (imageData != null) {
            FileOutputStream outStream = null;
            try {
                String myJpgPath = String.format(
                        "/sdcard/%d.jpg", System.currentTimeMillis());

                outStream = new FileOutputStream(myJpgPath);
                outStream.write(imageData);
                outStream.close();
                Log.d("TestApp", "onPictureTaken - wrote bytes: "
                        + imageData.length);

                c.startPreview();
                Toast.makeText(getApplicationContext(), String.format("%s written", myJpgPath), Toast.LENGTH_SHORT).show();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
        }
    }
};
4

2 に答える 2

4

もう 1 つの回避策は、プレビュー サイズと画像サイズの縦横比を一致させることです (つまり、setPreviewSize(w1,h1); setPictureSize(w2,h2) を w1/h1 ~ w2/h2 にします (小さな違いは問題ないようです))。たとえば、Desire HD S の場合、w1=800,h1=480, w2=2592,h2=1552 は、w1=960,h1=720,h2=2592,h2=1952 と同様に機能します (歪んだ画像を気にしない場合;- )

于 2011-10-14T15:03:27.683 に答える
2

さまざまな getSupportedPreviewSizes() を循環して最適な一致を見つける getBestPreviewSize(w,h) メソッドの一般的な実装を使用していると仮定します。画像が歪む理由は定かではありませんが、getBestPreviewSize メソッドの出力で parameters.setPreviewSize(size.width, size.height) メソッドを呼び出すことが問題の原因であることがわかりました。 HTC 欲望。また、コメントアウトすることで、画像のゆがみの問題が解消されることも確認しました。

于 2011-05-28T03:25:00.410 に答える