猿问

保存的位图方向不正确

这个问题已被问过无数次,但没有一个真正解决保存Bitmap.


这是我最初将 a 保存Bitmap到我的设备的方式:


FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();

mmr.setDataSource(mStringFilePath);

//Time is us

int mPresentationTime = mPlayer.getPresentationTime();

Bitmap mBitmap = mmr.getFrameAtTime(mPresentationTime, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);


File mFileBitmap = new File(directoryToStore, "test.png");

try {

    FileOutputStream outputStream = new FileOutputStream(mFileBitmap);

    mBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);

    outputStream.close();

} catch (Exception e) {

    e.printStackTrace();

}

以上保存.png了错误的方向。


然后我看到了这个答案,但问题是它将已经保存的旋转Bitmap到正确的方向。例如,如果您想将 设置Bitmap为 a ImageView,这很好。但是,如果我想共享Bitmap,或者想在设备库中打开它,方向仍然是不正确的。然后我将不得不执行与上述相同的过程 -FileOutputStream等等。这将导致同样的问题。


如何Bitmap以正确的方向将 a 保存到设备?


慕无忌1623718
浏览 177回答 3
3回答

哈士奇WWW

public static int getBitmapOriention(String path){    ExifInterface exif = null;    int orientation = 0;    try {        exif = new ExifInterface(path);        orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,                ExifInterface.ORIENTATION_UNDEFINED);        //Log.e("getBitmapOriention", "getBitmapOriention: "+orientation );    } catch (Exception e) {        e.printStackTrace();    }    return orientation;}/** * @param bitmap bitmap from path * @param orientation ExifInterface * @return oriention flag */public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {    Matrix matrix = new Matrix();    switch (orientation) {        case ExifInterface.ORIENTATION_NORMAL:            return bitmap;        case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:            matrix.setScale(-1, 1);            break;        case ExifInterface.ORIENTATION_ROTATE_180:            matrix.setRotate(180);            break;        case ExifInterface.ORIENTATION_FLIP_VERTICAL:            matrix.setRotate(180);            matrix.postScale(-1, 1);            break;        case ExifInterface.ORIENTATION_TRANSPOSE:            matrix.setRotate(90);            matrix.postScale(-1, 1);            break;        case ExifInterface.ORIENTATION_ROTATE_90:            matrix.setRotate(90);            break;        case ExifInterface.ORIENTATION_TRANSVERSE:            matrix.setRotate(-90);            matrix.postScale(-1, 1);            break;        case ExifInterface.ORIENTATION_ROTATE_270:            matrix.setRotate(-90);            break;        default:            return bitmap;    }    try {        Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);        bitmap.recycle();        return bmRotated;    }    catch (OutOfMemoryError e) {        e.printStackTrace();        return null;    }}它对我有用rotateBitmap(mBitmap,getBitmapOriention(mPath));

Smart猫小萌

您需要ExifInterface用于旋转。public static void normalizeImageForUri(Context context, Uri uri, ImageView imgImageView) {        try {//            Log.d(TAG, "URI value = " + uri.getPath());            ExifInterface exif = new ExifInterface(getRealPathFromURI(context, uri));//            Log.d(TAG, "Exif value = " + exif);            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);            Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);            Bitmap rotatedBitmap = rotateBitmap(bitmap, orientation);            imgImageView.setImageBitmap(rotatedBitmap);        } catch (IOException e) {            e.printStackTrace();        }}检查位图的旋转:private static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {        Matrix matrix = new Matrix();        switch (orientation) {            case ExifInterface.ORIENTATION_NORMAL:                return bitmap;            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:                matrix.setScale(-1, 1);                break;            case ExifInterface.ORIENTATION_ROTATE_180:                matrix.setRotate(180);                break;            case ExifInterface.ORIENTATION_FLIP_VERTICAL:                matrix.setRotate(180);                matrix.postScale(-1, 1);                break;            case ExifInterface.ORIENTATION_TRANSPOSE:                matrix.setRotate(90);                matrix.postScale(-1, 1);                break;            case ExifInterface.ORIENTATION_ROTATE_90:                matrix.setRotate(90);                break;            case ExifInterface.ORIENTATION_TRANSVERSE:                matrix.setRotate(-90);                matrix.postScale(-1, 1);                break;            case ExifInterface.ORIENTATION_ROTATE_270:                matrix.setRotate(-90);                break;            default:                return bitmap;        }        try {            Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);            bitmap.recycle();            return bmRotated;        } catch (OutOfMemoryError e) {            e.printStackTrace();            return null;        }    }
随时随地看视频慕课网APP

相关分类

Java
我要回答