Android图像调整大小并保留EXIF数据(方向,旋转等)

如果您的Android应用使用设备相机拍摄照片然后调整大小(这是非常常见的做法,可以减小上传大小),那么您可能不会意识到此调整大小操作会剥离Exif元数据。

这可能会导致问题,特别是如果所涉及的设备依靠“ Orientation”标签来正确显示图像。

不同的Android设备以不同的方式处理摄像头/图像旋转-我信任的旧Nexus One似乎总是在捕获后立即旋转图像,因此在查看文件时,文件的本机内容始终是“竖直的”。

但是,其他设备(尤其是我测试中的三星手机)不会旋转图像文件的内容-而是设置Exif'Orientation'标签。 每当以后显示图像时,相关的图像代码应检测到方向“标签”的存在并适当旋转图像。 但是,如果您对图像进行了任何位图处理并将其保存到新文件中,则所有该Exif数据都会丢失。

除了方向数据,您还可能会丢失其他有价值的元数据,例如品牌/型号等。

这让我感到困惑了几个星期(当图像显示在电话画廊中时,图像看起来是直立的,但是到达时我的服务器方向不好,没有明显的元数据)。 我在这里添加这个自我问题以帮助他人。 这篇博客文章非常有帮助:

Android调整图片大小而不会丢失EXIF信息

4个解决方案

43 votes

据我所知,没有一种机制可以自动保存元数据,甚至可以快照所有内容并批量传输。

相反,似乎您必须显式检查特定属性,然后使用ExifInterface将它们自己复制到新的图像文件中。

[HTTP://developer.Android.com/reference/Android/Media/EXIF interface.HTML]

所以像这样:

ExifInterface oldExif = new ExifInterface(oldImagePath);

String exifOrientation = oldExif.getAttribute(ExifInterface.TAG_ORIENTATION);

if (exifOrientation != null) {

ExifInterface newExif = new ExifInterface(imagePath);

newExif.setAttribute(ExifInterface.TAG_ORIENTATION, exifOrientation);

newExif.saveAttributes();

}

Mike Repass answered 2020-02-20T21:58:38Z

31 votes

对于懒惰的人,这是一个可重用的函数:

public static void copyExif(String oldPath, String newPath) throws IOException

{

ExifInterface oldExif = new ExifInterface(oldPath);

String[] attributes = new String[]

{

ExifInterface.TAG_APERTURE,

ExifInterface.TAG_DATETIME,

ExifInterface.TAG_DATETIME_DIGITIZED,

ExifInterface.TAG_EXPOSURE_TIME,

ExifInterface.TAG_FLASH,

ExifInterface.TAG_FOCAL_LENGTH,

ExifInterface.TAG_GPS_ALTITUDE,

ExifInterface.TAG_GPS_ALTITUDE_REF,

ExifInterface.TAG_GPS_DATESTAMP,

ExifInterface.TAG_GPS_LATITUDE,

ExifInterface.TAG_GPS_LATITUDE_REF,

ExifInterface.TAG_GPS_LONGITUDE,

ExifInterface.TAG_GPS_LONGITUDE_REF,

ExifInterface.TAG_GPS_PROCESSING_METHOD,

ExifInterface.TAG_GPS_TIMESTAMP,

ExifInterface.TAG_IMAGE_LENGTH,

ExifInterface.TAG_IMAGE_WIDTH,

ExifInterface.TAG_ISO,

ExifInterface.TAG_MAKE,

ExifInterface.TAG_MODEL,

ExifInterface.TAG_ORIENTATION,

ExifInterface.TAG_SUBSEC_TIME,

ExifInterface.TAG_SUBSEC_TIME_DIG,

ExifInterface.TAG_SUBSEC_TIME_ORIG,

ExifInterface.TAG_WHITE_BALANCE

};

ExifInterface newExif = new ExifInterface(newPath);

for (int i = 0; i < attributes.length; i++)

{

String value = oldExif.getAttribute(attributes[i]);

if (value != null)

newExif.setAttribute(attributes[i], value);

}

newExif.saveAttributes();

}

prom85 answered 2020-02-20T21:58:58Z

18 votes

正如其他人指出的那样,您必须将Exif数据从原始图像复制到最终调整大小的图像。 Sanselan Android库通常最适合此功能。 根据Android操作系统的版本,ExifInterface有时会破坏Exifdata。

另外,ExifInterface还处理有限数量的Exif标签,即仅处理它“知道”的标签。 另一方面,Sanselan将保留所有Exiftag和标记注释。

这是一篇博客文章,显示了如何使用Sanselan复制图像数据:

使用Sanselan复制Exif元数据

顺便说一句,在Android上,我也倾向于旋转图像并删除Orientation Exiftag。 例如,在具有Android 4.03的Nexus S上,摄像头在Exifmetadata中设置了方向标签,但网络视图忽略了该信息并错误地显示了图像。 可悲的是,旋转实际图像数据并删除Exiforientation标签是使每个程序正确显示图像的唯一方法。

Theo answered 2020-02-20T21:58:04Z

0 votes

已经是2019年了,没有比@ prom85,Mike Repass和Theo提出的更好的答案了。

在2016年,Android团队引入了ExifInterface支持库,如果您希望在Android版本之间保持一致的行为,那是最好的选择。 我最终创建了标签ExifInterface#EXIF_TAGS(源代码)的子集,然后仅对该子集进行迭代以从输入文件中提取元数据并将其设置为输出。 如果您需要复制所有标签,我建议您不要这样做! 无论如何,某些标签的值都需要相应地进行更新(例如TAG_IMAGE_LENGTH和TAG_IMAGE_WIDTH)。 就我个人而言,我一直在问一个问题,为什么我们首先需要保留所有metedata数据(无论如何,设备和相机之间的差异还是存在的),我们意识到gps位置和日期/时间数据也需要保留。

Krzysztof Skrzynecki answered 2020-02-20T21:59:25Z

android调整图片大小,Android图像调整大小并保留EXIF数据(方向,旋转等)相关推荐

  1. android exifinterface 图片大小,Android图像resize和保存EXIF数据(方向,旋转等)

    Android图像resize和保存EXIF数据(方向,旋转等) 如果您的Android应用程序使用设备相机拍摄照片然后resize(这对减小上传大小非常常见),但是您可能没有意识到此大小调整操作会剥 ...

  2. Android学习之复选框checkbox自定义样式以及调整图片大小

    1.自定义样式: 下载复选框样式图:https://www.iconfont.cn/home/index?spm=a313x.7781069.1998910419.2 图片重命名为英文(否则找不到)并 ...

  3. Mac电脑用预览功能调整图像大小?Mac调整图片大小方法

    要说到修改一张图片的尺寸大小,很多人的第一反应通常是打开 Photoshop 或者 Pixelmator,其实使用苹果MAC电脑有更简单方便的方法来调整图片的大小尺寸,OS X 自带的快速预览功能就可 ...

  4. android调整图片的色相,饱和度,灰度

    android调整图片的色相,饱和度,灰度 /*** 调整图片的色相,饱和度,灰度** @param srcBitmap* @param rotate* @param saturation* @par ...

  5. Python调整图片大小并保存调整后的图像

    Python调整图片大小并保存调整后的图像 目录 Python调整图片大小并保存调整后的图像 #原始图像

  6. android获取图片缩略图,Android系获取图片和视频的缩略图

    获取手机里视频缩略图: public static Bitmap getVideoThumbnail(ContentResolver cr,Uri uri) { Bitmap bitmap = nul ...

  7. python调整图片大小不覆盖exif_python---基础知识回顾(十一)图像处理模块PIL

    前戏: 虽然PIL没有入OpenCV那样强大的功能,但是所提供的功能,在一般的图像处理中足够使用. 图像类别: 计算机绘图中有两类图像:一类是矢量图,另一类是点阵图(位图) 矢量图: 基于计算机数字对 ...

  8. 如何等比例调整图片大小?

    如何等比例调整图片大小?将图片尺寸大小调整成我们需要的,是图片使用过程中最常见的,等比例调整图片尺寸大小可以防止图片变形,图片变形会使得图片无法使用,所以非常的重要.为了帮助大家提高工作效率,今天小编 ...

  9. Python「PIL」:调整图片大小

    使用 PIL 在图片比例不变的情况下修改图片大小. 目录 一.介绍 二.代码 一.介绍 Image.resize def resize(self, size, resample=BICUBIC, bo ...

  10. 利用CSS调整图片大小

    通常,我们可以给图片<img>设置一个CSS属性,定义其高度和宽度.但有时候,我们只希望控制图片的最大可见大小.这样的操作,一般有两种办法:1.直接使用CSS属性值:2.使用JavaScr ...

最新文章

  1. 2022-2028年中国商业综合体行业市场前瞻与投资规划分析报告
  2. 矩阵论习题:设A,B为投影矩阵,证明A+B仍为投影矩阵当且仅当AB=BA=0。
  3. JavaScript MVC之Jamal
  4. 如何利用 webpack 在项目中做出亮点
  5. 【POJ - 3041】Asteroids (二分图,最小点覆盖)
  6. 系统性能分析从入门到进阶
  7. 2020前端最新面试题(vue篇)
  8. G-华华对月月的忠诚
  9. MySQL深度剖析之数据在磁盘上存储(2021)
  10. 美国佐治亚大学计算机专业,乔治亚大学计算机科学类排名,真是细致的看
  11. show processlist中kill锁表语句与慢sql
  12. python安装notebook_Jupyter Notebook环境安装
  13. VC++每个版本对应的vcredist
  14. 2021-2027全球与中国兽医临床试验业务市场现状及未来发展趋势
  15. 回顾我的 2018 读书历程以及个人感悟,让我们一起期待更好的未来(本文耗时 8 个月。。。)
  16. 习题:一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。
  17. 如何进行用户留存分析
  18. Nim 博弈游戏详解
  19. Android Studio学习开发笔记--基础
  20. Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers简记

热门文章

  1. 计算机容斥原理,三集合容斥原理解题技巧
  2. 本地java源代码上传码云
  3. Python连载(0011): 十分钟理解元组
  4. 微信公众号python_微信公共平台框架-python(支持多账号)
  5. 计算机硬盘图标闪烁,电脑本地磁盘图标显示异常如何解决
  6. 如何处理给MacBook安装win10双系统时拷贝windows安装文件出错?
  7. shell 发送短信
  8. 去掉scan pattern多余port的方法
  9. 春季养肝注意三个行为,做对了一年少生病
  10. jpg转换excel转换器_Excel转换功能变得简单