在三星手机中拍摄照片旋转 90 度
Posted
技术标签:
【中文标题】在三星手机中拍摄照片旋转 90 度【英文标题】:Capture photo rotate 90 degree in samsung mobile 【发布时间】:2012-11-06 00:32:52 【问题描述】:照片旋转 90 度,同时从三星手机其余其他手机 (HTC) 中的相机捕获它工作正常。请帮帮我。
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, IMAGE_CAPTURE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
try
if (requestCode == IMAGE_CAPTURE)
if (resultCode == RESULT_OK)
Uri contentUri = data.getData();
if(contentUri!=null)
String[] proj = MediaStore.Images.Media.DATA ;
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
imageUri = Uri.parse(cursor.getString(column_index));
tempBitmap = (Bitmap) data.getExtras().get("data");
mainImageView.setImageBitmap(tempBitmap);
isCaptureFromCamera = true;
【问题讨论】:
您期望纵向图像方向吗? 不,我希望图像的方向与我拍摄的相同,例如我以纵向模式拍摄照片,那么它应该是纵向的,横向的也是一样的..请帮助我 在包括三星在内的不同 Android 设备上,相机纵向方向存在许多不同的错误。如果可能的话,通过使用旋转的 UI 元素来使用横向和假纵向模式,就像股票相机应用一样。 @Alex Cohn 这个问题有解决办法吗 我也遇到了这个问题,看看***.com/questions/8450539/… 为我解决了这个问题。 【参考方案1】:某些设备根据设备方向旋转图像。
这里我写了一种常用的方法来获取方向并以正确的比例获取图像
public Bitmap decodeFile(String path) //you can provide file path here
int orientation;
try
if (path == null)
return null;
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 0;
while (true)
if (width_tmp / 2 < REQUIRED_SIZE
|| height_tmp / 2 < REQUIRED_SIZE)
break;
width_tmp /= 2;
height_tmp /= 2;
scale++;
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
Bitmap bm = BitmapFactory.decodeFile(path, o2);
Bitmap bitmap = bm;
ExifInterface exif = new ExifInterface(path);
orientation = exif
.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
Log.e("ExifInteface .........", "rotation ="+orientation);
// exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90);
Log.e("orientation", "" + orientation);
Matrix m = new Matrix();
if ((orientation == ExifInterface.ORIENTATION_ROTATE_180))
m.postRotate(180);
// m.postScale((float) bm.getWidth(), (float) bm.getHeight());
// if(m.preRotate(90))
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
else if (orientation == ExifInterface.ORIENTATION_ROTATE_90)
m.postRotate(90);
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
else if (orientation == ExifInterface.ORIENTATION_ROTATE_270)
m.postRotate(270);
Log.e("in orientation", "" + orientation);
bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
return bitmap;
return bitmap;
catch (Exception e)
return null;
编辑:
这段代码没有优化,我只是展示了我的一个测试项目中的逻辑代码。
【讨论】:
它工作正常,但是当我在三星 Galaxy tab2(7") 中捕获连续快照时,它会给出“内存不足异常”。请您提供一些解决方案。 @Hasmukh 您可以更改比例大小位图,在这段代码中我让它变得可靠 是的,如果我给比例类型 8,那么它工作正常,但我需要显示大作为预览图像,还需要将该大图像上传为 byte64。 @Hasmukh 内存错误有时取决于设备堆大小,有时我们必须小心这些位图,使用后需要回收位图。 无论我如何握住 HTC 手机,当我使用此代码时,我都会不断得到方向 = 0。有人遇到同样的问题吗?【参考方案2】:您可以添加到上述解决方案的另一件事是"samsung".contentEquals(Build.MANUFACTURER)
。如果您知道您的问题仅与三星设备有关,您可以合理地确定您需要旋转返回的图像(仅)if ("samsung".contentEquals(Build.MANUFACTURER) && getActivity().getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT // && width > height//) // here you know you need to rotate
您可以“合理地”相信轮换是有必要的。
【讨论】:
它不是解决方案。三星的照片总是宽度>高度。仅适用于移植模式的错误。【参考方案3】:public static Bitmap rotateBitmap(Bitmap b, float degrees)
Matrix m = new Matrix();
if (degrees != 0)
// clockwise
m.postRotate(degrees, (float) b.getWidth() / 2,
(float) b.getHeight() / 2);
try
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
b.getHeight(), m, true);
if (b != b2)
b.recycle();
b = b2;
catch (OutOfMemoryError ex)
// We have no memory to rotate. Return the original bitmap.
return b;
【讨论】:
【参考方案4】:如果它确实是一个错误,那么您可能必须手动将其旋转回横向。位图数据始终具有宽度和高度,只需查看数字,如果宽度小于高度,请按照 alistair3408 的回答旋转图像。
【讨论】:
以上是关于在三星手机中拍摄照片旋转 90 度的主要内容,如果未能解决你的问题,请参考以下文章