37

ドキュメントによると、setRotation(90)は、キャプチャされたJPEG画像を回転させる必要があります(横向きモードではtakePicture)。

これはHTC電話では正常に機能しますが、Samsung GoogleNexusSおよびSamsungGalaxyS3では機能しません。これはバグですか?

マトリックス変換ローテーションを使用できることは知っていますが、OSがこれをより効率的に実行できることを望み、他のデバイスで過度にローテーションするリスクを冒したくありません。

編集

プレビューをポートレートモードに設定camera.setDisplayOrientation(90);しましたが、撮影した写真には何の影響もありませんでした。

さらに、setRotation私は画像サイズを設定しようとしました-ここで私は:で反転hwますparameters.setPictureSize(1200, 1600);。これも影響はありませんでした。

解決

どうやらSamsungの携帯電話は、個々のピクセルを回転させるのではなく、EXIF方向タグを設定しているようです。提案されているようariefbayuに、を使用してビットマップを読み取ることは、BitmapFactoryこのタグをサポートしていません。彼のコードサンプルがソリューションであり、このソリューションはの使用とも互換性がありinSampleSizeます。

4

2 に答える 2

34

Exifタグに関連してこれに答えようとします。これは私がしたことです:

Bitmap realImage = BitmapFactory.decodeStream(stream);

ExifInterface exif=new ExifInterface(getRealPathFromURI(imagePath));

Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION));
if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){

    realImage=ImageUtil.rotate(realImage, 90);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){
    realImage=ImageUtil.rotate(realImage, 270);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){
    realImage=ImageUtil.rotate(realImage, 180);
}

ImageUtil.rotate():_

public static Bitmap rotate(Bitmap bitmap, int degree) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    Matrix mtx = new Matrix();
    mtx.postRotate(degree);

    return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}
于 2012-06-13T23:33:58.880 に答える
3

Liso22、可変ストリームは違いはありません。ビットマップをプラグインするだけですが、取得しました(decodeFileなど)。また、'ImageUtil.rotate()' に問題がある場合は、'public static Bitmap rotate()' を同じパラメーターを持つメソッドとして記述し、'real image' をそれと等しくします。とにかく、この解決策は私にとってはうまくいかないようです.exifタグは、ポートレートでもランドスケープでも1(通常)を返します。

于 2013-05-23T03:20:09.620 に答える