Android图片处理:识别图像方向并显示
在Android中使用ImageView显示图片的时候发现图片显示不正。方向偏了或者倒过来了。
解决问题非常自然想到的分两步走:
1、自己主动识别图像方向,计算旋转角度。
2、对图像进行旋转并显示。
一、识别图像方向
首先在这里提一个概念EXIF(Exchangeable Image File Format,可交换图像文件),详细解释參见Wiki。
简而言之,Exif是一个标准,用于电子照相机(也包含手机、扫描器等)上。用来规范图片、声音、视屏以及它们的一些辅助标记格式。
Exif支持的格式例如以下:
图像
压缩图像文件:JPEG、DCT
非压缩图像文件:TIFF
不支持:JPEG 2000、PNG、GIF
音频
RIFF、WAV
Android提供了对JPEG格式图像Exif接口支持,能够读取JPEG文件metadata信息,參见ExifInterface.
这些Metadata信息总的来说大致分为三类:日期时间、空间信息(经纬度、高度)、Camera信息(孔径、焦距、旋转角、曝光量等等)。
二、图像旋转
Android中提供了对Bitmap进行矩阵旋转的操作。參见Bitmap提供的静态createBitmap方法.
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
Added in API level 1Returns an immutable bitmap from subset of the source bitmap, transformed by the optional matrix. The new bitmap may be the same object as source, or a copy may have been made. It is initialized with the same density as the original bitmap. If the source bitmap is immutable and the requested subset is the same as the source bitmap itself, then the source bitmap is returned and no new bitmap is created.
Parameters
source The bitmap we are subsetting x The x coordinate of the first pixel in source y The y coordinate of the first pixel in source width The number of pixels in each row height The number of rows m Optional matrix to be applied to the pixels filter true if the source should be filtered. Only applies if the matrix contains more than just translation. Returns
- A bitmap that represents the specified subset of source
Throws
IllegalArgumentException if the x, y, width, height values are outside of the dimensions of the source bitmap.
到此这两个问题理论上都攻克了,開始实际操作一下吧,參照下面代码。
public class IOHelper {
......
/** 从给定路径载入图片*/
public static Bitmap loadBitmap(String imgpath) {
return BitmapFactory.decodeFile(imgpath);
}
/** 从给定的路径载入图片,并指定是否自己主动旋转方向*/
public static Bitmap loadBitmap(String imgpath, boolean adjustOritation) {
if (!adjustOritation) {
return loadBitmap(imgpath);
} else {
Bitmap bm = loadBitmap(imgpath);
int digree = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(imgpath);
} catch (IOException e) {
e.printStackTrace();
exif = null;
}
if (exif != null) {
// 读取图片中相机方向信息
int ori = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
// 计算旋转角度
switch (ori) {
case ExifInterface.ORIENTATION_ROTATE_90:
digree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
digree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
digree = 270;
break;
default:
digree = 0;
break;
}
}
if (digree != 0) {
// 旋转图片
Matrix m = new Matrix();
m.postRotate(digree);
bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
bm.getHeight(), m, true);
}
return bm;
}
}
......
}
==========================================================================================
欢迎增加我们的技术交流群:
Android群: 66756039
JavaEE群: 361579846
Android图片处理:识别图像方向并显示的更多相关文章
- Android tess_two Android图片文字识别
文字识别一般都用的tesseract-ocr. GitHub:https://github.com/tesseract-ocr/tesseract 而Android对应的比较推荐的有个tess-two ...
- Android调用OCR识别图像中的文字
// CharacterExtractor.java // Copyright (c) 2010 William Whitney // All rights reserved. // This sof ...
- android 图片解码显示流程
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jingxia2008/article/details/32327699 问题来源 android 能 ...
- Android静态图片人脸识别的完整demo(附完整源码)
Demo功能:利用android自带的人脸识别进行识别,标记出眼睛和人脸位置.点击按键后进行人脸识别,完毕后显示到imageview上. 第一部分:布局文件activity_main.xml < ...
- 【Android】5.2 图像按钮和图片格式
分类:C#.Android.VS2015: 创建日期:2016-02-07 一.简介 1.ImageBtton ImageBtton的用法和Button相似,也有Click事件,用法也和Button一 ...
- Android实现OCR扫描识别数字图片之图片扫描识别
[Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...
- Android之拨号界面图片风格,无信息默认显示界面修改
Android之拨号界面图片风格,无信息默认显示界面修改 点开Dialer app,出现拨号,联系人,收藏三个选项卡,也就是三个Fragment,在三个界面都没有信息的时候会显示一个时钟,联系人,收藏 ...
- Java乔晓松-android中调用系统拍照功能并显示拍照的图片
android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...
- Android根据Button状态(normal,focused,pressed)显示不同背景图片
Android根据Button状态(normal,focused,pressed)显示不同背景图片 Android中Button 有focused, selected, pressed 等不同状态,通 ...
随机推荐
- dxg:TreeListView.RowDecorationTemplate
<dxg:TreeListView.RowDecorationTemplate> <ControlTemplate TargetType="ContentControl&q ...
- ORA-01843: 无效的月份,执行sql语句更改为美国语言后仍然失败的解决办法
ORA-01843: 无效的月份失败的 sql 为:XXXXXXXXXXXXXXXX 执行sql语句更改为美国语言后仍然失败, ALTER SESSION SET NLS_DATE_LANGUAGE= ...
- Linux命令行和Shell高效率使用方法
Ctrl+R快速搜索history Ctrl+P显示上一条命令 快速执行一条history命令:!!/!-number ======================================== ...
- Discuz常见小问题-如何使用QQ登陆
在首页中找到超链接 往下翻找到QQ互联,注意如果是内网无法开通(需要网站上传之后)
- 同时安装不同版本JDK遇到的问题
安装JDK1.8出现 Error opening registry key'software\Javasoft\Java Runtime Environment' java安装1.8后的问题:之前安装 ...
- 禁止CloudStack删除Xenserver原有虚拟机
CloudStack在文档中指明需要加入一台干净的Xenserver作为hyperviser. 但是实际使用中,总会存在不同的需求,很多场景是试用CloudStack接管当前已有的hyperviser ...
- ubuntu server 安装 mantis bug tracker 中文配置
ubuntu server 安装 mantis bug tracker 中文配置 官网:http://www.mantisbt.org/ 一:安装: 1:进入到 apache2的网站目录: cd /v ...
- HTTP和Socket的区别
1: HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用. HTTP ...
- linux常见题目
1. 把一个文件里面所有包含 abc 的行里面的 abc 替换成 def,然后输出第一列和第三列 cat abc.txt | grep abc | sed 's/abc/def/g' | awk '{ ...
- 自己写的一个读取execl的帮助类
目标:读取execl的第一个sheet,并传入不需要读取的表头的行数,返回该execl里所有数据的list 解析共有2种:1.DOM 2.SAX import java.io.File; i ...