最全Android中读取图片EXIF元数据之metadata-extractor的使用,2024年最新美团三面多久通过率

最后

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

}

}

}

示例2:)

public static void main(String[] args) throws Exception {

File mFile = new File(“F:/XXX.JPG”);

Metadata metadata = ImageMetadataReader.readMetadata(mFile);

for (Directory directory : metadata.getDirectories()) {

if(“ExifSubIFDDirectory”.equalsIgnoreCase( directory.getClass().getSimpleName() )){

//光圈F值=镜头的焦距/镜头光圈的直径

System.out.println(“光圈值: f/” + directory.getString(ExifSubIFDDirectory.TAG_FNUMBER) );

System.out.println("曝光时间: " + directory.getString(ExifSubIFDDirectory.TAG_EXPOSURE_TIME)+ “秒” );

System.out.println("ISO速度: " + directory.getString(ExifSubIFDDirectory.TAG_ISO_EQUIVALENT) );

System.out.println("焦距: " + directory.getString(ExifSubIFDDirectory.TAG_FOCAL_LENGTH) + “毫米” );

System.out.println("拍照时间: " + directory.getString(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL) );

System.out.println("宽: " + directory.getString(ExifSubIFDDirectory.TAG_EXIF_IMAGE_WIDTH) );

System.out.println("高: " + directory.getString(ExifSubIFDDirectory.TAG_EXIF_IMAGE_HEIGHT) );

}

if(“ExifIFD0Directory”.equalsIgnoreCase( directory.getClass().getSimpleName() )){

System.out.println("照相机制造商: " + directory.getString(ExifIFD0Directory.TAG_MAKE) );

System.out.println("照相机型号: " + directory.getString(ExifIFD0Directory.TAG_MODEL) );

System.out.println("水平分辨率: " + directory.getString(ExifIFD0Directory.TAG_X_RESOLUTION) );

System.out.println("垂直分辨率: " + directory.getString(ExifIFD0Directory.TAG_Y_RESOLUTION) );

}

}

}

示例3):

File mFilePath=“C://XXX.jpg”;

Metadata metadata = com.drew.imaging.jpeg.JpegMetadataReader.readMetadata(mFilePath);

JpegDirectory jd = (JpegDirectory)metadata.getDirectory(JpegDirectory.class);

System.out.println(“------------” + jd.getImageHeight()); //图片的高

System.out.println(“------------” + jd.getImageWidth()); //图片的宽

//由于只是读取图片的头信息,所以无论多大的图片都能读取,而且速度很快.

从执行的中可以看到照片的详细拍摄时间,拍摄用的相机型号,曝光时间,光圈值,焦距,ISO值 等等。

你也可以直接指定读取其中任意参数的值,ExifDirectory 类中定义了很多以 TAG_ 开头的整数常量,这些常量代表特定的一个参数值,例如要读取相机的型号,可以用下面代码来获取。

Metadata metadata = JpegMetadataReader.readMetadata(jpegFile);

Directory exif = metadata.getDirectory(ExifDirectory.class);

String model = exif.getString(ExifDirectory.TAG_MODEL);

上述提到的是如何获取照片的EXIF信息,其中包含一个很重要的信息就是——拍摄方向。例如所用的图片拍摄方向是:Orientation - Top, left side (Horizontal / normal)。我们在拍照的时候经常会根据场景的不同来选择相机的方向,例如拍摄一颗高树,我们会把相机竖着拍摄,使景物刚好适合整个取景框,但是这样得到的图片如果用普通的图片浏览器看便是倒着的,需要调整角度才能得到一个正常的图像。

通过读取图片的EXIF信息,可以得到关于拍摄方向的这样一个结果:Orientation - Left side, bottom (Rotate 270 CW)

而直接读取 ExitDirectory.TAG_ORIENTATION 标签的值是8。

来看下这个项目是如何来定义这些返回值的,打开源码包中的ExifDescriptor类的getOrientationDescription(),该方法代码如下:

public String getOrientationDescription() throws MetadataException{

if (!_directory.containsTag(ExifDirectory.TAG_ORIENTATION)) return null;

int orientation = _directory.getInt(ExifDirectory.TAG_ORIENTATION);

switch (orientation) {

case 1: return “Top, left side (Horizontal / normal)”;

case 2: return “Top, right side (Mirror horizontal)”;

case 3: return “Bottom, right side (Rotate 180)”;

case 4: return “Bottom, left side (Mirror vertical)”;

case 5: return “Left side, top (Mirror horizontal and rotate 270 CW)”;

case 6: return “Right side, top (Rotate 90 CW)”;

case 7: return “Right side, bottom (Mirror horizontal and rotate 90 CW)”;

case 8: return “Left side, bottom (Rotate 270 CW)”;

default:

return String.valueOf(orientation);

}

}

从这个方法可以清楚看到各个返回值的意思,如此我们便可以根据实际的返回值来对图像进行旋转或者是镜像处理了。

下面给出代码用以旋转图片,其他的关于图片的镜像等处理读者可以依此类推:

String mPath = “D:\XXX.JPG”;

File img = new File(mPath);

BufferedImage old_img = (BufferedImage)ImageIO.read(img);

int w = old_img.getWidth();

int h = old_img.getHeight();

BufferedImage new_img = new BufferedImage(h,w,BufferedImage.TYPE_INT_BGR);

Graphics2D g2d =new_img.createGraphics();

AffineTransform origXform = g2d.getTransform();

AffineTransform newXform = (AffineTransform)(origXform.clone());

// center of rotation is center of the panel

double xRot = w/2.0;

newXform.rotate(Math.toRadians(270.0), xRot, xRot); //旋转270度

g2d.setTransform(newXform);

// draw image centered in panel

g2d.drawImage(old_img, 0, 0, null);

// Reset to Original

g2d.setTransform(origXform);

//写到新的文件

FileOutputStream out = new FileOutputStream(“D:\XXX2.jpg”);

try{

ImageIO.write(new_img, “JPG”, out);

}finally{

out.close();

}

注:利用上面的代码旋转照片后,原有照片包含的EXIF信息就不存在了。关于该问题需要在照片旋转之前先把EXIF信息读出,然后再在旋转后写入新的照片中,可以使用 MediaUtil 包来写EXIF信息到图片文件中,关于这个包的使用可参考最后的链接。

照片的镜面翻转可以直接利用Graphic2D 的 drawImage 方法来实现:

public abstract boolean drawImage(Image img,

int dx1,int dy1,

int dx2,int dy2,

int sx1,int sy1,

int sx2,int sy2,

ImageObserver observer);

三、补充说明

======

解释部分参数的实际含义:

Make 生产者 指产品生产厂家

Model 型号 指设备型号

Orientation  方向 有的相机支持,有的不支持

X Resolution/Y Resolution X/Y方向分辨率 本栏目已有专门条目解释此问题

ResolutionUnit  分辨率单位 一般为PPI

Software  软件 显示固件Firmware版本

DateTime  日期和时间

YCbCrPositioning  色相定位

重要知识点

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

高级进阶篇——高级UI,自定义View(部分展示)

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

  • 面试题部分合集

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ndroid入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

[外链图片转存中…(img-75hmINeL-1715345505433)]

  • 面试题部分合集
    [外链图片转存中…(img-sjhrWokN-1715345505433)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
metadata-extractor是一个开源的Java库,它提供了一种方便的方式来从各种类型的文件提取元数据元数据是关于数据的数据,它描述了一份文件的属性、特征和内容。 metadata-extractor库支持从图片、音频、视频和各种文档格式(如PDF和Microsoft Office文档等)提取元数据。它可以读取文件的各种元数据信息,包括文件名称、大小、创建日期、修改日期、作者、描述、GPS位置、相机型号、拍摄日期、曝光时间、ISO速度等等。 使用metadata-extractor API非常简单。首先,我们需要将库添加到我们的项目。然后,我们可以使用Java代码来创建一个Metadata对象,并将文件路径作为参数传递给它。然后,我们可以使用Metadata对象提供的各种方法来获取特定的元数据信息。 例如,如果我们想获取一张图片的拍摄日期和相机型号,我们可以使用如下代码: ``` File file = new File("image.jpg"); Metadata metadata = ImageMetadataReader.readMetadata(file); Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class); Date date = directory.getDate(ExifIFD0Directory.TAG_DATETIME); String cameraModel = directory.getString(ExifIFD0Directory.TAG_MODEL); ``` 这段代码首先创建了一个File对象,并将文件路径传递给ImageMetadataReader.readMetadata()方法来读取图片元数据。然后,它使用getFirstDirectoryOfType()方法来获取ExifIFD0Directory目录,并从获取拍摄日期和相机型号。 metadata-extractor API还提供了其他方便的方法来获取和解析不同类型文件的元数据。通过使用这个库,我们可以轻松地获取各种文件元数据,方便我们在应用程序进行进一步处理和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值