【发布时间】:2017-11-18 00:59:28
【问题描述】:
我正在尝试在 Android 中旋转位图并在 ImageView 中显示定向位图。
uri = Uri.parse(path)
try {
Bitmap myBitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
Bitmap orientedBitmap = ExifUtil.rotateBitmap(path, myBitmap);
imageView.setImageBitmap(orientedBitmap);
} catch (IOException e) {
e.printStackTrace();
}
并使用来自https://gist.github.com/9re/1990019 的 ExifUtil 我尝试旋转它
public class ExifUtil {
public static Bitmap rotateBitmap(String src, Bitmap bitmap) {
try {
int orientation = getExifOrientation(src);
if (orientation == ExifInterface.ORIENTATION_NORMAL) {
return bitmap;
}
Matrix matrix = new Matrix();
switch (orientation) {
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 oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return oriented;
} catch (OutOfMemoryError e) {
e.printStackTrace();
return bitmap;
}
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
private static int getExifOrientation(String src) throws IOException {
int orientation = ExifInterface.ORIENTATION_UNDEFINED;
Log.e("src", src);
try {
ExifInterface exif = new ExifInterface(src);
orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, orientation);
} catch (SecurityException | IllegalArgumentException e) {
e.printStackTrace();
}
return orientation;
}
}
它给了我这个日志
11-17 17:03:20.265 3962-3962/it.package.path E/src: file:///storage/emulated/0/DCIM/image20171117_170310.jpg
11-17 17:03:30.781 3962-3962/it.package.path W/System.err: java.io.FileNotFoundException: file:/storage/emulated/0/DCIM/image20171117_170310.jpg (No such file or directory)
11-17 17:03:30.784 3962-3962/it.package.path W/System.err: at java.io.FileInputStream.open(Native Method)
11-17 17:03:30.786 3962-3962/it.package.path W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:146)
11-17 17:03:30.787 3962-3962/it.package.path W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:99)
11-17 17:03:30.789 3962-3962/it.package.path W/System.err: at android.media.ExifInterface.<init>(ExifInterface.java:1106)
11-17 17:03:30.791 3962-3962/it.package.path W/System.err: at it.package.path.ExifUtil.getExifOrientation(ExifUtil.java:68)
11-17 17:03:30.794 3962-3962/it.package.path W/System.err: at it.package.path.ExifUtil.rotateBitmap(ExifUtil.java:13)
11-17 17:03:30.795 3962-3962/it.package.path W/System.err: at it.package.path.PreviewFragment.onCreateView(PreviewFragment.java:57)
11-17 17:03:30.797 3962-3962/it.package.path W/System.err: at android.app.Fragment.performCreateView(Fragment.java:2352)
11-17 17:03:30.799 3962-3962/it.package.path W/System.err: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
11-17 17:03:30.800 3962-3962/it.package.path W/System.err: at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
11-17 17:03:30.801 3962-3962/it.package.path W/System.err: at android.app.BackStackRecord.run(BackStackRecord.java:815)
11-17 17:03:30.802 3962-3962/it.package.path W/System.err: at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1582)
11-17 17:03:30.804 3962-3962/it.package.path W/System.err: at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483)
11-17 17:03:30.806 3962-3962/it.package.path W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
11-17 17:03:30.808 3962-3962/it.package.path W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
11-17 17:03:30.809 3962-3962/it.package.path W/System.err: at android.os.Looper.loop(Looper.java:154)
11-17 17:03:30.811 3962-3962/it.package.path W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6692)
11-17 17:03:30.813 3962-3962/it.package.path W/System.err: at java.lang.reflect.Method.invoke(Native Method)
11-17 17:03:30.815 3962-3962/it.package.path W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
11-17 17:03:30.816 3962-3962/it.package.path W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
为什么 ExifInterface exif = new ExifInterface(src);` 在缺少两个斜杠的文件路径上抛出 FileNotFoundException?
【问题讨论】:
-
因为
path就是这样。path来自哪里? -
@CommonsWare 我从相机结果中得到它。问题是 src = 路径,正如您从
Log.e("src", src);src(和路径)=file:///storage/...中看到的那样,FileNotFound 是针对file:/storage/...的。为什么它会丢失 2 个斜线? -
真正的问题是:为什么要将
Uri的String形式传递给需要文件系统路径的方法?传递文件系统路径,而不是Uri。