array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 解决android有的手机拍照后上传图片被旋转的问题 - 爱码网

需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器

遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重。

解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法,可以获取图片的属性,读取图片的旋转角度。

第一种方式代码:

在onActivityResult里面处理跳转

  1. <spanstyle="font-size:18px;">Intentintent=newIntent(SendMicoBlog.this,RotaingActivity.class);
  2. MyAppmyApp=(MyApp)getApplication();
  3. myApp.setName(bitmap);//修改之后的名称
  4. myApp.setPhoto(isPhoto);
  5. startActivityForResult(intent,1);</span>

在RotaingActivity里面就可以作相应的旋转处理了

  1. <spanstyle="font-size:18px;">//获取bitmap
  2. MyAppmyApp=(MyApp)getApplication();
  3. bitmap=myApp.getName();
  4. System.out.println("RotaingActivityw="+bitmap.getWidth()+"H="+bitmap.getHeight());
  5. myBitmap=bitmap;
  6. myWidth=bitmap.getWidth();
  7. myHeight=bitmap.getHeight();
  8. //创建操作图片用的matrix对象
  9. matrix=newMatrix();
  10. Drawabledrawable=ImageDispose.bitmapToDrawable(bitmap);
  11. imageView.setBackgroundDrawable(drawable);
  12. btnCancel.setOnClickListener(newOnClickListener(){
  13. @Override
  14. publicvoidonClick(Viewv){
  15. RotaingActivity.this.finish();
  16. }
  17. });
  18. btnRightRotaing.setOnClickListener(newOnClickListener(){
  19. @Override
  20. publicvoidonClick(Viewv){
  21. myBitmap=rotaingImageView(-90);
  22. }
  23. });
  24. btnLeftRotaing.setOnClickListener(newOnClickListener(){
  25. @Override
  26. publicvoidonClick(Viewv){
  27. myBitmap=rotaingImageView(+90);
  28. }
  29. });
  30. btnOK.setOnClickListener(newOnClickListener(){
  31. @Override
  32. publicvoidonClick(Viewv){
  33. MyAppmyApp=(MyApp)getApplication();
  34. myApp.setName(myBitmap);//修改之后
  35. System.out.println("OKresultcoder");
  36. Intentintent=newIntent(RotaingActivity.this,SendMicoBlog.class);
  37. setResult(6,intent);
  38. RotaingActivity.this.finish();
  39. }
  40. });
  41. }
  42. privateBitmaprotaingImageView(intangle2){
  43. //旋转图片动作
  44. matrix.postRotate(angle2);
  45. System.out.println("angle2="+angle2);
  46. //创建新的图片
  47. BitmapresizedBitmap=Bitmap.createBitmap(bitmap,0,0,
  48. myWidth,myHeight,matrix,true);
  49. Drawabledrawable=ImageDispose.bitmapToDrawable(resizedBitmap);
  50. imageView.setBackgroundDrawable(drawable);
  51. returnresizedBitmap;
  52. }</span>

第二种方式:就简单多了,直接自己出偷着把照片给处理了,不需要用户的操作,这样体验会更好一点。

在onActivityResult里面处理

  1. BitmapFactory.OptionsbitmapOptions=newBitmapFactory.Options();
  2. bitmapOptions.inSampleSize=8;
  3. Filefile=newFile(SD_CARD_TEMP_DIR);
  4. /**
  5. *获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转
  6. */
  7. intdegree=ImageDispose.readPictureDegree(file.getAbsolutePath());



  1. <spanstyle="font-size:18px;">BitmapcameraBitmap=BitmapFactory.decodeFile(SD_CARD_TEMP_DIR,bitmapOptions);
  2. bitmap=cameraBitmap;
  3. /**
  4. *把图片旋转为正的方向
  5. */
  6. bitmap=ImageDispose.rotaingImageView(degree,bitmap);
  7. upload(bitmap);</span>

  1. <spanstyle="font-size:18px;">/**
  2. *旋转图片
  3. *@paramangle
  4. *@parambitmap
  5. *@returnBitmap
  6. */
  7. publicstaticBitmaprotaingImageView(intangle,Bitmapbitmap){
  8. //旋转图片动作
  9. Matrixmatrix=newMatrix();;
  10. matrix.postRotate(angle);
  11. System.out.println("angle2="+angle);
  12. //创建新的图片
  13. BitmapresizedBitmap=Bitmap.createBitmap(bitmap,0,0,
  14. bitmap.getWidth(),bitmap.getHeight(),matrix,true);
  15. returnresizedBitmap;
  16. }</span>


  1. /**
  2. *读取图片属性:旋转的角度
  3. *@parampath图片绝对路径
  4. *@returndegree旋转的角度
  5. */
  6. publicstaticintreadPictureDegree(Stringpath){
  7. intdegree=0;
  8. try{
  9. ExifInterfaceexifInterface=newExifInterface(path);
  10. intorientation=exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
  11. switch(orientation){
  12. caseExifInterface.ORIENTATION_ROTATE_90:
  13. degree=90;
  14. break;
  15. caseExifInterface.ORIENTATION_ROTATE_180:
  16. degree=180;
  17. break;
  18. caseExifInterface.ORIENTATION_ROTATE_270:
  19. degree=270;
  20. break;
  21. }
  22. }catch(IOExceptione){
  23. e.printStackTrace();
  24. }
  25. returndegree;
  26. }


这样就搞定了,此时你上传的照片就是正的了。

第一种方式的图片

解决android有的手机拍照后上传图片被旋转的问题

相关文章: