【发布时间】:2019-02-11 09:20:55
【问题描述】:
这个问题已经被问过无数次了,但在保存Bitmap时,没有一个能真正解决旋转问题。
这就是我最初将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。
然后我看到this 的答案,但问题是它会将已保存的Bitmap 旋转到正确的方向。例如,如果您想将Bitmap 设置为ImageView,这很好。但是,如果我想分享Bitmap,或者想在设备库中打开它,那么方向仍然是不正确的。然后我必须执行与上述相同的过程 - FileOutputStream 等。这将导致同样的问题。
如何以正确的方向将Bitmap 保存到设备中?
编辑 1
尝试Long提供的答案。
我使用您提供的 2 方法创建了一个名为 RotateBit 的新类。然后我将代码更改为:
FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(mStringFilePath);
//Time is us
int mPresentationTime = mPlayer.getPresentationTime();
Bitmap mBitmapBeforeRotation = mmr.getFrameAtTime(mPresentationTime, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);
int rotatingInt = RotateBit.getBitmapOriention(mStringFilePath);
Bitmap mBitmap = RotateBit.rotateBitmap(mBitmapBeforeRotation, rotatingInt);
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();
}
但旋转仍然不正确。
编辑 2
我注意到这个问题与FFmpegMediaMetadataRetriever有关,使用MediaMetadataRetriever时不会出现这个问题。
【问题讨论】:
-
你有
Bitmap mBitmap所以旋转它然后保存 -
@pskink 请参阅编辑 1。
-
"rotation is incorrect."是什么意思?rotatingInt你有什么? -
@pskink 如果视频是纵向录制的,那么我想将位图保存为相同的尺寸(纵向),但
Bitmap/png 向左旋转了 90 度。跨度> -
rotatingInt中有什么?尝试使用Log.d?