java实现读取图片exif数据(如拍摄时间,经纬度等)

本文介绍了一种利用com.drewnoakes.metadata-extractor库读取图片EXIF信息的方法,包括经度、纬度和拍摄时间等关键数据。通过添加依赖并创建ExifUitl工具类,实现了图片元数据的轻松读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们需要添加一个依赖

 <!-- https://mvnrepository.com/artifact/com.drewnoakes/metadata-extractor -->
        <dependency>
            <groupId>com.drewnoakes</groupId>
            <artifactId>metadata-extractor</artifactId>
            <version>2.7.2</version>
        </dependency>

然后我们可以利用依赖实现exif的读取。

package com.shengxi.wangyang.common.util;

import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import java.io.File;
import java.io.IOException;
import java.util.Collection;

/**
 * @author matthew
 * 实现文件exif属性操作工具类
 * @version 1.0.0
 * @date 2020-02-17 21:46:30
 */
public class ExifUitl {

    public static String[] readExif(File file) throws ImageProcessingException, IOException {

        String[] array = new String[3];
//如果你对图片的格式有限制,可以直接使用对应格式的Reader如:JPEGImageReader
        ImageMetadataReader.readMetadata(file)
                .getDirectories().forEach(v ->
                v.getTags().forEach(t -> {
                    System.out.println(t.getTagName() + " : " + t.getDescription());
                    switch (t.getTagName()) {
                        //                    经度
                        case "GPS Longitude":
                            array[0] = t.getDescription();
                            break;
                        //                        纬度
                        case "GPS Latitude":
                            array[1] = t.getDescription();
                            break;
                        //                        拍摄时间
                        case "Date/Time Original":
                            array[2] = t.getDescription();
                        default:
                            break;
                    }
                })
        );
        return array;
    }

}

如果想获取其他的exif参数,可以利用直接打印exif读取出来的tag还有对应的description查看。这里需要注意:他的本质是一个map。所以如果你对应的参数如果没有,打印是不会有对应的tag的。

### 使用Java读取图像中的GPS经纬度信息 为了实现这一目标,可以利用Apache Sanselan库来解析JPEG文件并提取其中嵌入的EXIF数据。下面是一个具体的例子说明如何操作: ```java import org.apache.sanselan.Sanselan; import org.apache.sanselan.common.IImageMetadata; import org.apache.sanselan.formats.jpeg.JpegImageMetadata; import org.apache.sanselan.formats.tiff.TiffField; import org.apache.sanselan.formats.tiff.constants.ExifTagConstants; import java.io.File; public class GpsDataExtractor { public static void main(String[] args) throws Exception { File file = new File("path/to/your/image.jpg"); IImageMetadata metadata = Sanselan.getMetadata(file); if (!(metadata instanceof JpegImageMetadata)) { System.out.println("Not a JPEG or no EXIF data found."); return; } JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; TiffField gpsLatitudeRef = jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_GPS_LATITUDE_REF); TiffField gpsLongitudeRef = jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_GPS_LONGITUDE_REF); TiffField gpsLatitude = jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_GPS_LATITUDE); TiffField gpsLongitude = jpegMetadata.findEXIFValue(ExifTagConstants.EXIF_TAG_GPS_LONGITUDE); if (gpsLatitude != null && gpsLongitude != null && gpsLatitudeRef != null && gpsLongitudeRef != null) { String latRef = gpsLatitudeRef.getStringValue(); double latitude = convertRationalToDouble(gpsLatitude.getValues()); String lonRef = gpsLongitudeRef.getStringValue(); double longitude = convertRationalToDouble(gpsLongitude.getValues()); System.out.printf("Latitude: %.6f %s\n", Math.abs(latitude), latRef); System.out.printf("Longitude: %.6f %s\n", Math.abs(longitude), lonRef); } else { System.out.println("No GPS coordinates found."); } } private static double convertRationalToDouble(Object[] rationalArray) { StringBuilder sb = new StringBuilder(); for (Object obj : rationalArray) { sb.append(obj.toString()).append(","); } String[] parts = sb.toString().split(","); int degreeNumerator = Integer.parseInt(parts[0]); int degreeDenominator = Integer.parseInt(parts[1]); int minuteNumerator = Integer.parseInt(parts[2]); int minuteDenominator = Integer.parseInt(parts[3]); int secondNumerator = Integer.parseInt(parts[4]); int secondDenominator = Integer.parseInt(parts[5]); return degreeNumerator / (double)degreeDenominator + minuteNumerator / (double)(minuteDenominator * 60) + secondNumerator / (double)(secondDenominator * 3600); } } ``` 上述代码展示了如何通过Sanselan API获取图片内的地理坐标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matthew_leung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值