关于android中调用系统拍照,返回图片是旋转90度..
来源:互联网 发布:哪个剪辑软件最快 编辑:程序博客网 时间:2024/04/30 01:15
http://my.oschina.net/techstan/blog/142592
由于项目的需要,没有自定义拍照功能,仅仅调用了系统的拍照程序..但是出现了一个问题,就是拍照完成显示图片居然是被旋转的图片....
解决办法:
01
/**
02
* 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转
03
*/
04
int
degree = readPictureDegree(f.getAbsolutePath());
05
06
BitmapFactory.Options opts=
new
BitmapFactory.Options();
//获取缩略图显示到屏幕上
07
opts.inSampleSize=
2
;
08
Bitmap cbitmap=BitmapFactory.decodeFile(f.getAbsolutePath(),opts);
09
10
/**
11
* 把图片旋转为正的方向
12
*/
13
Bitmap newbitmap = rotaingImageView(degree, cbitmap);
14
iv.setImageBitmap(newbitmap);
01
/**
02
* 读取图片属性:旋转的角度
03
* @param path 图片绝对路径
04
* @return degree旋转的角度
05
*/
06
public
static
int
readPictureDegree(String path) {
07
int
degree =
0
;
08
try
{
09
ExifInterface exifInterface =
new
ExifInterface(path);
10
int
orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
11
switch
(orientation) {
12
case
ExifInterface.ORIENTATION_ROTATE_90:
13
degree =
90
;
14
break
;
15
case
ExifInterface.ORIENTATION_ROTATE_180:
16
degree =
180
;
17
break
;
18
case
ExifInterface.ORIENTATION_ROTATE_270:
19
degree =
270
;
20
break
;
21
}
22
}
catch
(IOException e) {
23
e.printStackTrace();
24
}
25
return
degree;
26
}
27
/*
28
* 旋转图片
29
* @param angle
30
* @param bitmap
31
* @return Bitmap
32
*/
33
public
static
Bitmap rotaingImageView(
int
angle , Bitmap bitmap) {
34
//旋转图片 动作
35
Matrix matrix =
new
Matrix();;
36
matrix.postRotate(angle);
37
System.out.println(
"angle2="
+ angle);
38
// 创建新的图片
39
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap,
0
,
0
,
40
bitmap.getWidth(), bitmap.getHeight(), matrix,
true
);
41
return
resizedBitmap;
42
}
http://blog.csdn.net/walker02/article/details/8211628
解决android有的手机拍照后上传图片被旋转的问题
需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器
遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重。
解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法,可以获取图片的属性,读取图片的旋转角度。
第一种方式代码:
在onActivityResult里面处理跳转
- <span style="font-size:18px;"> Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class);
- MyApp myApp = (MyApp)getApplication();
- myApp.setName(bitmap);//修改之后的名称
- myApp.setPhoto(isPhoto);
- startActivityForResult(intent, 1);</span>
在RotaingActivity里面就可以作相应的旋转处理了
- <span style="font-size:18px;"> //获取bitmap
- MyApp myApp = (MyApp)getApplication();
- bitmap = myApp.getName();
- System.out.println("RotaingActivity w = " + bitmap.getWidth() + "H = " + bitmap.getHeight());
- myBitmap = bitmap;
- myWidth = bitmap.getWidth();
- myHeight = bitmap.getHeight();
- // 创建操作图片用的matrix对象
- matrix = new Matrix();
- Drawable drawable = ImageDispose.bitmapToDrawable(bitmap);
- imageView.setBackgroundDrawable(drawable);
- btnCancel.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- RotaingActivity.this.finish();
- }
- });
- btnRightRotaing.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- myBitmap = rotaingImageView(-90);
- }
- });
- btnLeftRotaing.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- myBitmap = rotaingImageView(+90);
- }
- });
- btnOK.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- MyApp myApp = (MyApp)getApplication();
- myApp.setName(myBitmap);//修改之后
- System.out.println("OK resultcoder");
- Intent intent = new Intent(RotaingActivity.this, SendMicoBlog.class);
- setResult(6, intent);
- RotaingActivity.this.finish();
- }
- });
- }
- private Bitmap rotaingImageView(int angle2) {
- //旋转图片 动作
- matrix.postRotate(angle2);
- System.out.println("angle2=" + angle2);
- // 创建新的图片
- Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
- myWidth, myHeight, matrix, true);
- Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap);
- imageView.setBackgroundDrawable(drawable);
- return resizedBitmap;
- }</span>
第二种方式:就简单多了,直接自己出偷着把照片给处理了,不需要用户的操作,这样体验会更好一点。
在onActivityResult里面处理
- BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
- bitmapOptions.inSampleSize = 8;
- File file = new File(SD_CARD_TEMP_DIR);
- /**
- * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转
- */
- int degree = ImageDispose.readPictureDegree(file.getAbsolutePath());
- <span style="font-size:18px;">Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions);
- bitmap = cameraBitmap;
- /**
- * 把图片旋转为正的方向
- */
- bitmap = ImageDispose.rotaingImageView(degree, bitmap);
- upload(bitmap);</span>
- <span style="font-size:18px;"> /**
- * 旋转图片
- * @param angle
- * @param bitmap
- * @return Bitmap
- */
- public static Bitmap rotaingImageView(int angle , Bitmap bitmap) {
- //旋转图片 动作
- Matrix matrix = new Matrix();;
- matrix.postRotate(angle);
- System.out.println("angle2=" + angle);
- // 创建新的图片
- Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
- bitmap.getWidth(), bitmap.getHeight(), matrix, true);
- return resizedBitmap;
- }</span>
- /**
- * 读取图片属性:旋转的角度
- * @param path 图片绝对路径
- * @return degree旋转的角度
- */
- public static int readPictureDegree(String path) {
- int degree = 0;
- try {
- ExifInterface exifInterface = new ExifInterface(path);
- int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
- switch (orientation) {
- case ExifInterface.ORIENTATION_ROTATE_90:
- degree = 90;
- break;
- case ExifInterface.ORIENTATION_ROTATE_180:
- degree = 180;
- break;
- case ExifInterface.ORIENTATION_ROTATE_270:
- degree = 270;
- break;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return degree;
- }
这样就搞定了,此时你上传的照片就是正的了。
第一种方式的图片
http://asysbang.com/forum.php?mod=viewthread&tid=58&extra=page%3D1
1、预览时正确显示
主要参考系统相机代码实现getDisplayOritation就可以了
//在preview之前调用setDisplayOrientation
int degrees = getDisplayOritation(getDispalyRotation(), cameraId);
mCamera.setDisplayOrientation(degrees);
mCamera.startPreview();
getDisplayOritation函数如下:
private int getDisplayOritation(int degrees, int cameraId) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
} else {
result = (info.orientation - degrees + 360) % 360;
}
return result;
}
private int getDispalyRotation() {
int i = getWindowManager().getDefaultDisplay().getRotation();
switch (i) {
case Surface.ROTATION_0:
return 0;
case Surface.ROTATION_90:
return 90;
case Surface.ROTATION_180:
return 180;
case Surface.ROTATION_270:
return 270;
}
return 0;
}
2、显示图片时正确显示
竖屏拍照的照片,直接使用的话,会旋转90度
参考系统图库的代码,需要先查询mediascanner的orientation字段,然后应用再把角度旋转过来,这样显示就ok了
参考代码如下:
假设c为查询mediaprovider数据库返回的cursor
int rotation = c.getInt(c.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION));
if (rotation != 0) {
Bitmap bitmap = BitmapFactory.decodeFile(path);
imageBefore.setImageBitmap(bitmap);
Matrix m = new Matrix();
m.setRotate(rotation);
Bitmap transformed = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
return transformed;
}
- 关于android中调用系统拍照,返回图片是旋转90度..
- 关于android中调用系统拍照,返回图片是旋转90度..
- 关于android中调用系统拍照,返回图片是旋转90度..
- 关于android中调用系统拍照,返回图片是旋转90度
- 关于android中调用系统拍照,返回图片是旋转90度..
- 关于android中调用系统拍照,返回图片是旋转90度...
- 关于android中调用系统拍照,返回图片是旋转90度..
- android中调用系统拍照,返回图片是旋转90度
- 关于调用系统拍照返回图片报错的问题
- MVP模式的Android 调用系统拍照,相册,剪裁,适配到7.0,修复拍照图片旋转问题
- Android 7.0 调用系统拍照,相册,剪裁,修复拍照图片旋转问题
- android关于手机拍照图片旋转问题
- Android解决三星手机拍照图片调用时逆时针旋转90度问题
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- android调用系统拍照程序和从图库选取图片,返回后调用系统裁剪工具
- 关于部分手机调用系统拍照和相册图片出现旋转问题处理
- 关于三星手机调用系统相机拍照旋转屏导致图片数据丢失问题
- PLSQL Developer 通过oracle客户端 连接oracle
- 服务器集群学习笔记
- python中列表的pop、remove、-1
- DWR使用详解
- CStdioFile 读取unicade环境下乱码处理
- 关于android中调用系统拍照,返回图片是旋转90度..
- Android代码混淆
- AnimationPacker重写
- 根据Dreamweaver里的ToolTip代码改进的提示框
- setcolor(2); line(x0,y0,x,y);}
- 常用加密算法
- OpenCL 第6课:矩阵转置
- LeetCode: Longest Common Prefix
- Oracle Security Alert for CVE-2014-0160