需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器
遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重。
解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法,可以获取图片的属性,读取图片的旋转角度。
第一种方式代码:
在onActivityResult里面处理跳转
1. <span style="font-size:18px;"> Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class);
2. MyApp myApp = (MyApp)getApplication();
3. //修改之后的名称
4. myApp.setPhoto(isPhoto);
5. 1);</span>
在RotaingActivity里面就可以作相应的旋转处理了
1. <span style="font-size:18px;"> //获取bitmap
2. MyApp myApp = (MyApp)getApplication();
3. bitmap = myApp.getName();
4. "RotaingActivity w = " + bitmap.getWidth() + "H = " + bitmap.getHeight());
5. myBitmap = bitmap;
6. myWidth = bitmap.getWidth();
7. myHeight = bitmap.getHeight();
8.
9. // 创建操作图片用的matrix对象
10. new Matrix();
11. Drawable drawable = ImageDispose.bitmapToDrawable(bitmap);
12. imageView.setBackgroundDrawable(drawable);
13.
14.
15. new OnClickListener() {
16.
17. @Override
18. public void onClick(View v) {
19.
20. this.finish();
21. }
22. });
23.
24. new OnClickListener() {
25.
26. @Override
27. public void onClick(View v) {
28. 90);
29. }
30. });
31.
32. new OnClickListener() {
33.
34. @Override
35. public void onClick(View v) {
36. 90);
37. }
38. });
39.
40. new OnClickListener() {
41.
42. @Override
43. public void onClick(View v) {
44. MyApp myApp = (MyApp)getApplication();
45. //修改之后
46. "OK resultcoder");
47. new Intent(RotaingActivity.this, SendMicoBlog.class);
48. 6, intent);
49. this.finish();
50. }
51. });
52. }
53. private Bitmap rotaingImageView(int angle2) {
54. //旋转图片 动作
55. matrix.postRotate(angle2);
56. "angle2=" + angle2);
57. // 创建新的图片
58. 0, 0,
59. true);
60. Drawable drawable = ImageDispose.bitmapToDrawable(resizedBitmap);
61. imageView.setBackgroundDrawable(drawable);
62. return resizedBitmap;
63. }</span>
第二种方式:就简单多了,直接自己出偷着把照片给处理了,不需要用户的操作,这样体验会更好一点。
在onActivityResult里面处理
1. BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
2. bitmapOptions.inSampleSize = 8;
3. File file = new File(SD_CARD_TEMP_DIR);
4. /**
5. * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转
6. */
7. int degree = ImageDispose.readPictureDegree(file.getAbsolutePath());
1. <span style="font-size:18px;">Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions);
2. bitmap = cameraBitmap;
3. /**
4. * 把图片旋转为正的方向
5. */
6. bitmap = ImageDispose.rotaingImageView(degree, bitmap);
7. upload(bitmap);</span>
1. <span style="font-size:18px;"> /**
2. * 旋转图片
3. * @param angle
4. * @param bitmap
5. * @return Bitmap
6. */
7. public static Bitmap rotaingImageView(int angle , Bitmap bitmap) {
8. //旋转图片 动作
9. new Matrix();;
10. matrix.postRotate(angle);
11. "angle2=" + angle);
12. // 创建新的图片
13. 0, 0,
14. true);
15. return resizedBitmap;
16. }</span>
1. /**
2. * 读取图片属性:旋转的角度
3. * @param path 图片绝对路径
4. * @return degree旋转的角度
5. */
6. public static int readPictureDegree(String path) {
7. int degree = 0;
8. try {
9. new ExifInterface(path);
10. int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
11. switch (orientation) {
12. case ExifInterface.ORIENTATION_ROTATE_90:
13. 90;
14. break;
15. case ExifInterface.ORIENTATION_ROTATE_180:
16. 180;
17. break;
18. case ExifInterface.ORIENTATION_ROTATE_270:
19. 270;
20. break;
21. }
22. catch (IOException e) {
23. e.printStackTrace();
24. }
25. return degree;
26. }
这样就搞定了,此时你上传的照片就是正的了。
第一种方式的图片