热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要介绍了解决android有的手机拍照后上传图片被旋转的问题的相关资料,需要的朋友可以参考下

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

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

第一种方式代码:

在onActivityResult里面处理跳转

   Intent intent = new Intent(SendMicoBlog.this, RotaingActivity.class); 
    MyApp myApp = (MyApp)getApplication(); 
    myApp.setName(bitmap);//修改之后的名称 
    myApp.setPhoto(isPhoto); 
    startActivityForResult(intent, 1); 

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

   //获取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; 
  } 

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

在onActivityResult里面处理

BitmapFactory.Options bitmapOptiOns= new BitmapFactory.Options(); 
bitmapOptions.inSampleSize = 8; 
File file = new File(SD_CARD_TEMP_DIR); 
/** 
 * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转 
 */ 
int degree = ImageDispose.readPictureDegree(file.getAbsolutePath()); 
Bitmap cameraBitmap = BitmapFactory.decodeFile(SD_CARD_TEMP_DIR, bitmapOptions); 
bitmap = cameraBitmap; 
/** 
 * 把图片旋转为正的方向 
 */ 
bitmap = ImageDispose.rotaingImageView(degree, bitmap); 
upload(bitmap); 

 /** 
   * 旋转图片 
   * @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; 
  } 

/** 
 * 读取图片属性:旋转的角度 
 * @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; 
  } 

 

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

第一种方式的图片

以上就是对解决android有的手机拍照后上传图片被旋转的问题,谢谢大家对本站的支持!


推荐阅读
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 2023年最佳PHP开发学习路径推荐
    本文详细探讨了针对不同背景的学习者如何选择最适合自己的PHP开发学习资源,包括书籍、在线课程及培训机构的推荐。 ... [详细]
  • 深入解析SSL Strip攻击机制
    本文详细介绍了SSL Strip(一种网络攻击形式)的工作原理及其对网络安全的影响。通过分析SSL与HTTPS的基本概念,探讨了SSL Strip如何利用某些网站的安全配置不足,实现中间人攻击,以及如何防范此类攻击。 ... [详细]
  • JavaWeb技术架构解析
    本文探讨了JavaWeb开发中客户端与服务器端的交互模式,重点分析了B/S(浏览器/服务器)和C/S(客户端/服务器)两种架构的特点及应用场景。 ... [详细]
  • 性能测试工具的选择与应用
    本文探讨了性能测试工具的重要性及其在软件测试中的作用,重点介绍了选择合适性能测试工具的考量因素,并对几种常用的性能测试工具进行了对比分析。 ... [详细]
  • 探索Squid反向代理中的远程代码执行漏洞
    本文深入探讨了在网站渗透测试过程中发现的Squid反向代理系统中存在的远程代码执行漏洞,旨在帮助网站管理者和开发者了解此类漏洞的危害及防范措施。 ... [详细]
  • 本文详细介绍了如何使用 PHP 编程语言输出 99 乘法表,包括使用不同的循环结构如 do-while、for 循环等方法,并提供了具体的代码示例。 ... [详细]
  • 地球坐标、火星坐标及百度坐标间的转换算法 C# 实现
    本文介绍了WGS84坐标系统及其精度改进历程,探讨了火星坐标系统的安全性和应用背景,并详细解析了火星坐标与百度坐标之间的转换算法,提供了C#语言的实现代码。 ... [详细]
  • 近期,谷歌公司的一名安全工程师Eduardo Vela在jQuery Mobile框架中发现了一项可能引发跨站脚本攻击(XSS)的安全漏洞。此漏洞使得使用jQuery Mobile的所有网站面临潜在的安全威胁。 ... [详细]
  • 本文提供了2023年最新的解决方案,帮助用户了解如何在移动设备上顺利访问和浏览PHP网页,涵盖从基础设置到高级技巧的全方位指导。 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 题目 CF1245F: 清理春天的数学挑战 描述了一个数学问题:给定一个区间 [L, R](0 ≤ L, R ≤ 10^9),求该区间内满足 x + y = x ∧ y 的数对 (x, y) 的总数。 ... [详细]
  • 探讨在Android JNI/NDK环境中遇到的SIGSEGV崩溃问题,以及如何通过自定义信号处理器进行调试的方法。 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
author-avatar
手机用户2602886175
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有