解决三星调用系统相机拍照显示图片旋转90度横着的问题

Android相机拍照方向旋转的解决方案:ExifInterface 一、 碰到的问题 写这篇文章的动机源自于这波迭代中碰到的一个问题: 在IM拍照时,在三星s7 eadge上拍完照片后从sd上拿到的地址设置给Imageview后显示时,图片旋转了90度。But我拍照的时候明明是竖着拍的,相册预览也是竖着的,为什么拿到图片后就成了横着的? 对比了另一台手机锤子坚果U1,没这个问题,因此怀疑是跟相机的机型相关。 想到的解决... 阅读详情

最近项目有个功能是调用系统相机拍照上传图片的功能,发现别的手机都没有ok,只有三星的显示图片很明显是旋转了90度,横着的。后来百度了解是三星对android相机单独做了优化(android碎片化,各种UI。。。你懂得)。所以要想根据路径显示图片时顺带读取图片的信息就行,ExifInterface(exif exchangeable image file) ,这个接口提供了图片文件的旋转,gps,时间等信息(具体的功能可以自行百度)。上代码:

			// 从指定路径下读取图片,并获取其EXIF信息
			ExifInterface exifInterface = new ExifInterface(path);
			// 获取图片的旋转信息
			int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
					ExifInterface.ORIENTATION_NORMAL);
			Log.e("jxf", "orientation" + orientation);
			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;

所以我们根据图片的旋转角度信息在onActivityResult方法中将图片旋转过来就行了,这时我们就要用到Matrix这个类生产旋转矩阵:

			// 得到图片的旋转角度
			int degree = getBitmapDegree(strImgPath);
			// 根据旋转角度,生成旋转矩阵
			Matrix matrix = new Matrix();
			matrix.postRotate(degree); 
			Bitmap returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

而我们想要的正确的图片就在这个returnBm对象中,我们只需imageView.setImageBitmap(returnBm);即可。

上面是我们实现适配三星的核心代码,下面将具体的相机util类奉上,由于我们项目中需要上传图片和图片名字, 所以会在调用相机拍照的同时返回图片名字,具体可以根据自己项目的具体需要自行调整:

/**
 * 调用系统相机拍照工具类
 * @author yao
 *
 */
public class CaremaUtil {
	private static String strImgPath = "";// 照片的绝对路径
	private static String imgPath = "";// 照片所在文件夹路径
	// 保存的拍照文件
	private static File out;
	/**
	 * 相机照相并返回图片名字
	 */
	public static String cameraMethod(Activity activity, int requestCode) {
		// 实例化拍照的Intent
		Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		// 设置图片存放的路径,Environment.getExternalStorageDirectory()得到SD卡的根目录
		// 先验证手机是否有sdcard
		String status = Environment.getExternalStorageState();
		if ((Environment.MEDIA_MOUNTED).equals(status)) {
			strImgPath = getImgPath();
			// 本地保存原图
			File file = new File(strImgPath);
			Uri u = Uri.fromFile(file);
			imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, u);
			// 启动ACITIVITY
			activity.startActivityForResult(imageCaptureIntent, requestCode);
			LogUtil.log("imageName---" + getImageName());
		} else {
			Toast.makeText(activity, "没有储存卡", 0).show();
		}
		return getImageName();
	}
	/**
	 * 返回图片的绝对路径
	 * 
	 * @return
	 */
	public static String getImgPath() {
		imgPath = getImagePath();// 存放照片的文件夹
		LogUtil.log("图片存放的路径-----" + strImgPath);
		String imageName = getImageName();
		LogUtil.log("图片全名路径---" + imageName);
		// 检查存放的路径是否存在,如果不存在则创建目录
		try {
			out = new File(imgPath);
			if (!out.exists()) {
				out.mkdirs();
			}
			// 在此目录下创建文件
			out = new File(imgPath, imageName);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 该照片的绝对路径
		strImgPath = imgPath + imageName;
		return strImgPath;
	}
	/**
	 * 得到图片所在的文件夹的路径
	 * 
	 * @return
	 */
	public static String getImagePath() {
		return Environment.getExternalStorageDirectory().getAbsolutePath() + "//"
				+ SoftApplication.softApplication.getString(R.string.app_name) + "/approvalPic/";
	}
	/**
	 * 得到图片的名字
	 * 
	 * @return
	 */
	public static String getImageName() {
		// 给相片命名
		String imageName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";// 照片命名
		return imageName;
	}
	/**
	 * 显示图片并得到图片字节字符串
	 * 
	 * @param resultCode
	 * @param data
	 */
	public static String showPic(Activity activity, Intent data, ImageView imageView) {
		String iamgeStr = new String();
		File file = new File(strImgPath);
		try {
			Uri uri = Uri.fromFile(file);
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inJustDecodeBounds = true;
			// 简单的压缩
			BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(uri), null, options);
			options.inSampleSize = 4;
			options.inJustDecodeBounds = false; // 压缩完后便可以将inJustDecodeBounds设置为false
			// 把流转化为Bitmap图片
			Bitmap bitmap = BitmapFactory.decodeStream(activity.getContentResolver().openInputStream(uri), null,
					options);
			android.provider.MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, null, null);
			activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
			
			// 得到图片的旋转角度
			int degree = getBitmapDegree(strImgPath);
			// 根据旋转角度,生成旋转矩阵
			Matrix matrix = new Matrix();
			matrix.postRotate(degree); 
			Bitmap returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
			imageView.setImageBitmap(returnBm);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
			byte[] bitmapByte = baos.toByteArray();
			iamgeStr = StringUtil.encodeStr(bitmapByte);
			LogUtil.log("iamgeStr", Log.ERROR, iamgeStr);
			// LogUtil.log("iamgeStr1", Log.ERROR, imageStr1);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return iamgeStr;
	}
	/**
	 * 清除本地拍照缓存
	 */
	public static void clearCacheImage() {
		File filecache = new File(getImagePath());
		LogUtil.log("filecache---" + filecache.getPath());
		if (filecache != null && filecache.listFiles() != null) {
			for (File file : filecache.listFiles()) {
				if (file.isFile()) {
					file.delete(); // 删除所有文件
					LogUtil.log("删除所有文件");
				}
			}
		}
	}
	
	/**
	 * 获取原始图片的角度(解决三星手机拍照后图片是横着的问题)
	 * @param path 图片的绝对路径
	 * @return 原始图片的角度
	 */
	public static int getBitmapDegree(String path) {
		int degree = 0;
		try {
			// 从指定路径下读取图片,并获取其EXIF信息
			ExifInterface exifInterface = new ExifInterface(path);
			// 获取图片的旋转信息
			int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
					ExifInterface.ORIENTATION_NORMAL);
			Log.e("jxf", "orientation" + orientation);
			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;
	}
}

附上点击调用相机拍照的代码:
	public void onClickEvent(View view) {
		switch (view.getId()) {
		case R.id.ll_customPic:// 客户合照
			
			imageName1 = CaremaUtil.cameraMethod(mContext, RESULT_CAPTURE_IMAGE_1);
			LogUtil.log("imageName1---" + imageName1);
			break;
		case R.id.ll_bar_scene:// 柜台场景
			
			imageName2 = CaremaUtil.cameraMethod(mContext, RESULT_CAPTURE_IMAGE_2);
			LogUtil.log("imageName2---" + imageName2);
			break;
		case R.id.btn_submit:// 提交
			submitWork();
			break;

		default:
			break;
		}

	}

这里面imageName1,imageName2是要上传的图片名字。

另外再附上onActivityResult中的代码:

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		switch (requestCode) {
		case RESULT_CAPTURE_IMAGE_1:// 客户合照
			// 如果返回为正确的的结果
			if (resultCode == RESULT_OK) {
				imageStr1 = CaremaUtil.showPic(mContext, data, customPic);
			}
			break;
		case RESULT_CAPTURE_IMAGE_2:// 柜台照片
			// 如果返回为正确的的结果
			if (resultCode == RESULT_OK) {
				imageStr2 = CaremaUtil.showPic(mContext, data, barScene);
			}
			break;
		}
	}

这里面imageStr1,imageStr2是要上传图片的二进制流的字符串。


三星手机拍照旋转问题 调用相机拍照出现横竖屏切换? 三星手机调用相机拍照出现横竖屏切换?拍照获取图片时,当应用是竖屏时,在部分手机上,如:三星note3上,图片不能正常显示,会旋转90°。1.调用拍照后,读取临时存储的图片,temp为自定义的路径 调用拍照Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); 阅读详情

相关推荐

PMAC上位机通信原理(C#)

基础是引用 两个 ODT dll 原理是先注册到communication.AsyncDataAvailable事件中去 if (bSuccess1) { communication.AsyncDataAvailable += communication_AsyncDataAvailable; } bool bSuccess2 = communication1.GPAsciiConnect(strIP, iPort, strName, strPassword); i

weixin_45507349的博客 1086

Android使用ExifInterface处理调用相机或调用相册后回调图片的旋转问题

在写一个有关调用相机和调用相册的demo的时候,发现回调的图片全是歪的...然后就上网查了查,发现有个ExifInterface可以解决此问题,遂开此一贴作个笔记

WindGrin_的博客 1992

Haystack框架实战:从零构建企业级智能问答系统

自然语言处理(NLP)技术通过让计算机理解和生成人类语言,正在深刻改变信息检索与交互方式。其核心原理在于将文本转化为机器可处理的向量表示,并通过语义相似度计算实现精准匹配。这一技术价值在于能够从海量非结构化数据中快速提取精准信息,大幅提升知识获取效率。在工程实践中,检索增强生成(RAG)架构结合了密集向量检索与大语言模型生成能力,成为构建智能问答、知识库助手等应用的主流方案。该架构通过将用户查询与文档库进行语义匹配,并为大语言模型提供精准上下文,有效提升了回答的准确性与可追溯性。本文以Haystack这一生

weixin_42521032的博客 577

图片和视频编辑之旋转角度问题

在做图片和视频编辑时,不可避免的是旋转角度问题,这里仅记录下相关处理策略。 图片旋转角度 获取图片旋转角度 一般情况下,Camera拍摄的图片和视频都存在旋转角度问题,真正渲染时,需要进行旋转操作。在Android平台上可以通过ExifInterface类获取JPEG的EXIF信息,其中就包括了旋转角度,如下所示: // 图片旋转角度,该角度表示在正常图片的基础上逆时针旋转的角度 var degr...

weixin_34367845的博客 950

2023,程序员的出路在哪里?

可是似乎从30岁开始这工资就没涨过,前面跳槽几次涨的薪水在30岁以后跳槽已经不管用了、定格了,这几年由于市场环境不景气,程序员竞争越来越激烈,36岁跟30拿的工资一模一样,不仅工资拿的一样,反而事情还越来越多了,这些都意味着什么?处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。虽然目前不少大型互联网企业都在进行结构性调整,但是从互联网行业发展的基本面来看,未来在产业互联网发展的过程中,IT行业和传统行业将会释放出大量的就业岗位,所以未来程序员的发展空间还是非常值得期待的。

AI天才研究院 20万+

基于STM32L4XX、HAL库的MCP4561数字电位器驱动程序设计

/ HAL库需要左移一位。* @param address: 设备地址(0x2C-0x2F)* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hi2c: I2C句柄。

zhusl6688的博客 340

Android 解决部分手机拍照后获取的图片被旋转的问题

最近又被测试MM找茬了,调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。。。其它品牌的手机都是正常的,就三星出现这个怪事。 在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊! 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就

梦工厂 2万+

Ubuntu Rtx3090 Cuda11.7 安装 pytorch3d

pytorch ubuntu pytorch3d 安装

G果的博客 2273

记一个使用系统相机拍照后照片被旋转的问题

最近在做项目的自定义相册时,遇到了这么一个问题:从 小米9 手机上面的拉起系统相机进行拍照,然后上传到服务器上面,发现图片莫名其妙就旋转了 90° ,这个并不符合业务方的需求,在仔细分析后,发现拍照后,系统保存到本地的照片已经给旋转过了 因此要解决这个问题,就只有在拍照后,判断图片是否给旋转,如果有,就将它旋转回去 要获取图片的旋转信息,其实就是要获取图片的 Exit 信息,它里面存储了图片的全部参数,我们可以通过 ExifInterface 来获取到这个数据: /** * 读取图片的旋转的角度 *.

FritzXu的博客 2625

SoulX-FlashHead 加速实践,提升3倍。

SoulX-FlashHead 加速实践,提升3倍。

jacke121的专栏 221

深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

文章目录前期工作设置GPU导入数据标准化可视化构建CNN网络编译训练模型预测模型评估 前期工作 设置GPU 如果使用的是CPU可以忽略这步 import tensorflow as tf gpus = tf.config.list_physical_devices("GPU") if gpus: gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量

“365天深度学习训练营”报名进行中~ 7854

android 三星手机拍照旋转90度,解决三星调用系统相机拍照显示图片旋转90度横着的问题...

/***调用系统相机拍照工具类*@authoryao**/publicclassCaremaUtil{privatestaticStringstrImgPath="";//照片的绝对路径privatestaticStringimgPath="";//照片所在文件夹路径//保存的拍照文件privatestaticFileout;/***相机照相并返回图片...

weixin_42501119的博客 527

使用字体解密技术爬取懂车帝二手车数据

本文介绍了一种针对懂车帝二手车平台的字体加密数据采集方案。通过抓包分析,识别出关键API接口并解析了字体加密机制,成功实现了价格等敏感数据的解密。方案采用requests库发送POST请求获取JSON数据,利用fontTools解析字体映射关系,建立加密字符到真实数字的转换算法。程序支持多页采集,提取车辆名称、价格、年份等12个维度的信息,并自动保存为Excel格式。技术亮点包括动态字体解析、健壮的数据处理和分页优化,为二手车市场分析提供了可靠的数据支持。文中特别强调数据采集的合法合规性,建议仅用于学术研究

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1310

Android开发:解决三星设备拍照后获取的图片被旋转的问题

文章转自 ZHU_文涛 调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍变成竖的,竖着拍变成横的。。。测试其它品牌的手机是正常的,就三星出现这个问题。 解决方法: 1、首先在调用拍照方法时,保存拍照后的相片原图,得到原图路径,(PhotoBitmapUtils是我自己写的一个工具类)     String fileName = "";     /**     ...

小五博客园 1269

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android 部分手机拍照后获取的图片被旋转

三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。。。其它品牌的手机都是正常的,就三星出现这个怪事。 解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了。 在获取相机返回的回调方法onActivityResult()中,修复被旋转的图片并取得修复后的图片路径,有了这个路径后就可以展示出来了 @Override public void onA...

陈立的博客 1621

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android 8.0版本调用拍照或系统图片出现旋转问题

调用Android系统拍照功能后,三星手机(还有小米8,目前发现这两个机型)拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。其它品牌的手机都是正常的,就三星出现这个怪事。 在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊! 解决办法是获取到拍照后照片被旋转的角度,再旋转...

im_coding的博客 1296

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 系统拍照 方向,Android 系统Camera拍照照片旋转

读取图片旋转的角度,然后根据角度把图片旋转过来。/*** 读取图片属性:旋转的角度* @param path 图片绝对路径* @return degree旋转的角度*/public static int readPictureDegree(String path) {int degree = 0;try {ExifInterface exifInterface = new ExifInterfa...

weixin_32566055的博客 699

android 三星手机拍照旋转90度,解决三星拍照上传照片被旋转90度,和三星相机崩溃...

刚刚想起来前几天面试的时候遇到的一个问题,问题大概是这样的做拍照上传图片功能的时候,在三星手机上拍出的照片是旋转了90度的,应该如何解决这个问题。因为之前没有遇到过这种问题,当时我回答的是给图片做一个ObjectAnimator的rotation动画。结果这个是错误的。 在这里做一个记录吧,防止遇到这样的问题。造成这个问题的原因是三星堆Android相机单独做了优化。要解决这个问题我们需要根...

weixin_39984098的博客 896

android 竖屏拍照旋转90度,三星等机型上拍照后图片被旋转90度的解决方案

考虑到Android7.0以后拍照修改了调用和返回方式,找到了一个看起来还不错的第三方库,实际可能并非如此。-TakePhoto在三星Note3和S6上测试,发现竖屏拍照后返回的照片是横屏的,在其它手机上又是正常的。查了资料发现三星手机很多都有这个问题,看到了歪果仁开发者对这个问题近乎骂街的回复,发现这属于三星的一个系统级Bug。竖屏拍照后得到的照片文件就是横屏的,只有应用对这些照片重新处理。/*...

weixin_28860509的博客 983

android 自动相机 图片旋转问题,Android部分手机拍照后获取的图片被旋转问题的解决方法...

调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。其它品牌的手机都是正常的,就三星出现这个怪事。在Android适配上,我原来一直以为国内的小米手机够奇葩了,结果还有更奇葩的!你说你没事旋转照片干啥,实在是猜不透其居心何在,纯粹是在给开发者制造麻烦啊!解决办法是获取到拍照后照片被旋转的角度,再旋转回去就好了。具体思路:1、首先在调用拍照方...

weixin_29421565的博客 1299

android 选择图片或拍照时旋转了90度问题

由于前面的博文中忽略了点内容,所以在这里补上,下面内容就是解决拍照或者选择图片显示的时候图片旋转了90度或者其他度数问题,以便照片可以正面显示:具体如下:   首先直接看上面博文下的拍完照或者选完图后处理部分: @Override protected void onActivityResult(int requestCode, int resultCode, Intent data...

xiao12593a的专栏 478

相机Camera(预览--拍照)--两种方式(包含横竖屏切换两种方式)

代码需要权限如下: <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="andr...

八步赶蝉 9965

三星手机拍照,上传照片或者下载导致图片旋转90°的解决办法。

项目需求。 因为项目中需要对拍照之后的图片进行上传。 (这也是一个简单的问题) 但是就是三星手机(三星note3),出现拍照之后照片旋转了九十度。 然后我们上传上去,然后通过其他手机请求url在此显示还是旋转过的。说说我们解决问题的路径。 1. 起初以为我们上传照片的时候就是旋转过了的,但是查看图片所在的位置,结果发现图片是正的。 那么是为什么再次下载图片还是旋转的,我们就

记录自己 7134

Bitmap图片处理

/** * 旋转图片 *  * @param angle * @param bitmap * @return Bitmap */ public static Bitmap rotateImageView(int angle, Bitmap bitmap) { // 旋转图片 动作 Matrix matrix = new Matrix(); matrix.postRotate(a

suiyi491的专栏 558

android 部分手机Camera 拍照 图片被旋转90度的解决方法

部分手机拍照完后 图片旋转角度90度,目前解决方法普遍都是通过图片路径,获取图片信息判断角度,然后转换角度。如下: /** * 读取图片属性:旋转的角度 * @param path 图片绝对路径 * @return degree旋转的角度 */ public int readPictureDegree(String path) { ...

闪电的博客 1万+

Android解决三星手机拍照图片调用时逆时针旋转90度问题

Uri uri = getIntent().getData(); System.out.println("图片URI地址" + uri.toString()); Point point = DisplayUtil.getScreenPoint(this); Bitmap bitmap = ImageUtils.decodeBitmapWithOrien

魑魅魍魉9527 2042
上一篇: PopupWindow常见问题
下一篇: android图形验证码
coder_yao
博客等级 码龄10年 9粉丝 19原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值