`

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 1

Returns 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 x y width height m filter
The bitmap we are subsetting
The x coordinate of the first pixel in source
The y coordinate of the first pixel in source
The number of pixels in each row
The number of rows
Optional matrix to be applied to the pixels
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图片处理:识别图像方向并显示实例教程

    解决这个问题很自然想到的分两步走: 1、自动识别图像方向,计算旋转角度; 2、对图像进行旋转并显示。一、识别图像方向 首先在这里提一个概念EXIF(Exchangeable Image File Format,可交换图像文件),具体解释参见...

    自动识别图像方向

    因此,“自动识别图像方向”这一主题在Android应用开发中尤为重要。 ### 自动识别并调整图像方向 在提供的代码片段中,我们看到一个名为`loadBitmap`的方法,它有两个重载版本。第一个版本仅负责加载图像,第二个...

    android上的OCR图像识别

    总结来说,"android上的OCR图像识别"项目是利用OCR技术在Android平台上识别图像中的汉字。这涉及到Android应用开发、Tesseract OCR引擎的集成和使用,以及可能的图像处理技巧。通过这个项目,开发者可以学习到如何将...

    Android-AndroidCamera内置人脸识别的Demo

    在人脸识别方面,Android SDK提供了一个叫做FaceDetector的类,它可以检测图像中的人脸并返回人脸的位置、大小和方向。FaceDetector的工作原理是基于图像处理算法,例如Haar特征级联分类器,这是一种广泛应用于...

    Android 安卓图像识别技术识别麻将源码Demo APP

    1. 图像预处理:在对麻将牌进行识别之前,需要先对获取的图像进行预处理,如灰度化、直方图均衡化、二值化等,以增强图像特征并减少后续处理的复杂性。 2. 特征提取:这是图像识别的核心环节,通过算法如SIFT(尺度...

    基于android的饮食识别系统.rar

    本文将深入探讨一个基于Android平台的饮食识别系统,它通过摄像头拍摄食物图片,然后运用SIFT(尺度不变特征转换)算法进行图像处理与匹配,从而识别出食物的种类。虽然当前系统的识别速度略显缓慢,但其潜在的应用...

    Android实现阿里OCR通用类文字识别Demo

    总之,Android实现阿里OCR通用类文字识别Demo涉及到多个技术环节,包括图片处理、网络请求、第三方API调用、JSON解析以及UI展示等。通过学习和实践这个Demo,开发者可以掌握如何在Android应用中集成和使用OCR服务,...

    Android使用opencv拼接图片

    在Android平台上,OpenCV是一个强大的计算机视觉库,它允许开发者执行复杂的图像处理任务,包括图像识别、特征检测、图像拼接等。在这个场景中,我们要讨论的是如何利用OpenCV来识别两张图片的相同区域,并进行去重...

    最全的OCR图像识别技术源码内有说明

    - "android_ocr" 文件可能包含了一个完整的Android项目,包括Tesseract的集成、相机权限管理、图像捕获、预处理、调用OCR引擎进行识别以及结果显示等部分。通过阅读源码,开发者可以了解如何在Android应用中实现一...

    Android 车牌识别

    在Android平台上进行车牌识别是一项涉及图像处理和计算机视觉技术的应用,它主要目的是自动检测和识别车辆的车牌号码。这项技术广泛应用于智能交通、停车场管理、安防监控等领域。在这个名为"VehiclePlateOCR-master...

    图像字符识别(android OCR).7z

    开发者可以利用Tesseract库来识别图像中的文字,同时对其进行优化以提高准确率。 3. **预处理步骤**:在识别前,通常需要对图像进行预处理,包括灰度化、二值化、去噪、倾斜校正等,以提高识别效果。这些步骤可以...

    Android 3D相册图片滑动倾斜放大倒影处理源码

    这通常需要计算出每个图片的倾斜角度,并实时更新图像的变换矩阵。 放大效果是用户在查看图片时,可以进行局部放大,以更清晰地查看细节。这可以通过多点触控手势识别来实现,动态调整图片的缩放比例,同时保持图片...

    android人脸识别

    本项目基于"android facedetector",它利用Android系统的内置FaceDetector类来检测图像中的人脸,并将识别到的人脸实时显示在View中。以下是对这个主题的详细解析。 1. **FaceDetector类**: Android SDK提供了一...

    OCR文字识别_Android.rar

    OCR(Optical Character Recognition,光学字符识别)技术是将图像中的文字转换成机器编码文本的过程,广泛应用于文档扫描、图片转文字、车牌识别等领域。在Android平台上,开发OCR应用涉及多个关键技术点,包括图像...

    android下图像特征点提取

    在Android平台上进行图像处理,特征点提取是一项关键的技术。特征点是图像中具有显著性和稳定性的点,它们在不同视角、光照变化下仍能被可靠地识别,这对于图像匹配、物体识别、全景拼接等应用至关重要。SIFT(尺度...

    基于Android平台的人脸识别研究

    本文针对人脸识别技术的关键环节进行了深入研究,并在Android平台上开发了一款基于图像的人脸识别系统。具体的研究内容和成果包括: 1. **人脸识别算法概述与优化** - 本研究首先总结了人脸识别中常用的算法,并...

    javacv对图片进行文字提取,定位指定文字在图片的位置坐标,提高识别速度

    JavaCV 是一个强大的 Java 库,它为 Java 和 Android ...总之,JavaCV 结合 OpenCV 和 Tesseract 可以帮助我们高效地完成图片中文字的提取和定位,通过优化图像处理和识别流程,可以显著提高 OCR 系统的速度和准确性。

    基于android的饮食识别系统

    在这个系统中,SIFT(尺度不变特征变换)算法起到了关键作用,它是一种强大的特征检测和描述方法,能够帮助系统在不同尺度和旋转下识别图像中的关键特征。 SIFT算法的详细过程包括以下几个步骤: 1. **尺度空间...

Global site tag (gtag.js) - Google Analytics