0

画像をキャプチャするアプリを作成しました。問題は、キャプチャ後に画像が 90 度回転することです。私は設定しました

camera.setDisplayOrientation(NINTY_DEGREES);

ただし、これは のプレビューにのみ影響しSurfaceViewます。本当の問題は、カメラから取得したバイトが反転することです。なぜこれが起こったのですか?キャプチャする前に反転するように設定できる設定はありますか?

画像がキャプチャされると、アクティビティがイベントにサブスクライブします。byte[]がいっぱいになったときに登録する方法は次のとおりです。

camera.takePicture(null, null, new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                if (null != callback)
                    callback.onJpegPictureTaken(data, camera);
            }
        });

私の中でActivity

public class History extends BaseWindow implements OnClickListener, CaptureImageCallback

および関連するメソッド:

@Override
public void onJpegPictureTaken(byte[] data, Camera camera) {
        Intent i = new Intent(this, ImageEditing.class);
        i.putExtra("image", data);
        startActivity(i);
}

画像データを含むパラメータを確認できますdata。このバイト配列は 90 度回転しています。もちろん、90 度回転させることもできImageViewますが、自家製の Web サービスなどの他のシステムで作業するため、このホット フィックスをすべての外部システムに適用する必要があります。この回転を修正するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

0

キャプチャした画像の「角度」を取得し、角度ごとに回転できます。

ExifInterface exif = new ExifInterface(imagePath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);

int angle = 0;

if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
    angle = 90;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
    angle = 180;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
    angle = 270;
}

Log.d("Tag", "Angle: " + angle);

Matrix mat = new Matrix();
mat.postRotate(angle);

if (angle != 0)
    Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), mat, true);
于 2013-04-05T11:40:40.737 に答える
-1

名前が示すようsetDisplayOrientation()に、表示専用です。ドクは言う

これは、onPreviewFrame(byte[], Camera)、JPEG 画像、または録画されたビデオで渡されるバイト配列の順序には影響しません。

したがって、回転した画像を保存する場合は、保存する前に自分で回転させる必要があります。

于 2013-04-05T11:32:25.993 に答える