我的朋友正在使用 Struts (Java),我们正在尝试查找 JPEG 图片的 GeoLocation。
我不知道在哪里阅读或如何为它实现 java 代码。
我想以 jpeg 格式获取图像并将其显示在网站上的谷歌地图上。
你如何将这些信息从 Exif 标签传递到谷歌地图,这样我就可以在地图上看到位置
我的朋友正在使用 Struts (Java),我们正在尝试查找 JPEG 图片的 GeoLocation。
我不知道在哪里阅读或如何为它实现 java 代码。
我想以 jpeg 格式获取图像并将其显示在网站上的谷歌地图上。
你如何将这些信息从 Exif 标签传递到谷歌地图,这样我就可以在地图上看到位置
地理位置部分与 Struts 无关。Struts 只涉及数据的呈现。
图像的地理位置有时存储在 JPEG 文件的元数据中。您可以使用这样的库从JPEG 图像中提取元数据。
请注意,许多相机不存储地理位置数据。
您的问题有 2 个部分
这里详细讨论第一部分
现在使用apache commons-imaging 库大大简化和简化了读取 Image Meta
/**
* Reference : https://github.com/apache/commons-imaging/blob/master/src/test/java/org/apache/commons/imaging/examples/MetadataExample.java
*/
public static void readImageMeta(final File imgFile) throws ImageReadException, IOException {
/** get all metadata stored in EXIF format (ie. from JPEG or TIFF). **/
final ImageMetadata metadata = Imaging.getMetadata(imgFile);
System.out.println(metadata);
System.out.println("--------------------------------------------------------------------------------");
/** Get specific meta data information by drilling down the meta **/
if (metadata instanceof JpegImageMetadata) {
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LATITUDE);
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);
printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LONGITUDE);
// simple interface to GPS data
final TiffImageMetadata exifMetadata = jpegMetadata.getExif();
if (null != exifMetadata) {
final TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS();
if (null != gpsInfo) {
final String gpsDescription = gpsInfo.toString();
final double longitude = gpsInfo.getLongitudeAsDegreesEast();
final double latitude = gpsInfo.getLatitudeAsDegreesNorth();
System.out.println(" " + "GPS Description: " + gpsDescription);
System.out.println(" " + "GPS Longitude (Degrees East): " + longitude);
System.out.println(" " + "GPS Latitude (Degrees North): " + latitude);
}
}
// more specific example of how to manually access GPS values
final TiffField gpsLatitudeRefField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);
final TiffField gpsLatitudeField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LATITUDE);
final TiffField gpsLongitudeRefField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);
final TiffField gpsLongitudeField = jpegMetadata.findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LONGITUDE);
if (gpsLatitudeRefField != null && gpsLatitudeField != null && gpsLongitudeRefField != null && gpsLongitudeField != null) {
// all of these values are strings.
final String gpsLatitudeRef = (String) gpsLatitudeRefField.getValue();
final RationalNumber[] gpsLatitude = (RationalNumber[]) (gpsLatitudeField.getValue());
final String gpsLongitudeRef = (String) gpsLongitudeRefField.getValue();
final RationalNumber[] gpsLongitude = (RationalNumber[]) gpsLongitudeField.getValue();
final RationalNumber gpsLatitudeDegrees = gpsLatitude[0];
final RationalNumber gpsLatitudeMinutes = gpsLatitude[1];
final RationalNumber gpsLatitudeSeconds = gpsLatitude[2];
final RationalNumber gpsLongitudeDegrees = gpsLongitude[0];
final RationalNumber gpsLongitudeMinutes = gpsLongitude[1];
final RationalNumber gpsLongitudeSeconds = gpsLongitude[2];
// This will format the gps info like so:
//
// gpsLatitude: 8 degrees, 40 minutes, 42.2 seconds S
// gpsLongitude: 115 degrees, 26 minutes, 21.8 seconds E
System.out.println(" " + "GPS Latitude: " + gpsLatitudeDegrees.toDisplayString() + " degrees, " + gpsLatitudeMinutes.toDisplayString() + " minutes, " + gpsLatitudeSeconds.toDisplayString() + " seconds " + gpsLatitudeRef);
System.out.println(" " + "GPS Longitude: " + gpsLongitudeDegrees.toDisplayString() + " degrees, " + gpsLongitudeMinutes.toDisplayString() + " minutes, " + gpsLongitudeSeconds.toDisplayString() + " seconds " + gpsLongitudeRef);
}
}
}
private static void printTagValue(final JpegImageMetadata jpegMetadata, TagInfo tagInfo) {
final TiffField field = jpegMetadata.findEXIFValueWithExactMatch(tagInfo);
if (field == null) {
System.out.println(tagInfo.name + ": " + "Not Found.");
} else {
System.out.println(tagInfo.name + ": " + field.getValueDescription());
}
}
public static void main(String[] args) throws IOException, ImageReadException {
File sourceFile = new File("/Users/vivek/myimage.jpg");
readImageMeta(sourceFile);
}
上面的代码将给出这个输出
Exif metadata:
Root:
ImageWidth: 3024
ImageLength: 4032
BitsPerSample: 8, 8, 8
PhotometricInterpretation: 2
Make: 'Apple'
Model: 'iPhone 6s'
Orientation: 1
SamplesPerPixel: 3
XResolution: 72
YResolution: 72
ResolutionUnit: 2
Software: 'Adobe Photoshop CC 2015 (Macintosh)'
DateTime: '2016:05:17 16:55:55'
YCbCrPositioning: 1
ExifOffset: 300
GPSInfo: 868
Exif:
ExposureTime: 1/100 (0.01)
FNumber: 11/5 (2.2)
ExposureProgram: 2
PhotographicSensitivity: 40
ExifVersion: 48, 50, 50, 49
DateTimeOriginal: '2016:05:08 18:03:57'
DateTimeDigitized: '2016:05:08 18:03:57'
ComponentsConfiguration: 1, 2, 3, 0
ShutterSpeedValue: 35113/5284 (6.645)
ApertureValue: 7983/3509 (2.275)
BrightnessValue: 13026/2395 (5.439)
ExposureCompensation: 0
MeteringMode: 5
Flash: 16
FocalLength: 83/20 (4.15)
SubjectArea: 618, 1555, 310, 311
SubSecTimeOriginal: '523'
SubSecTimeDigitized: '523'
FlashpixVersion: 48, 49, 48, 48
ColorSpace: 1
ExifImageWidth: 3024
ExifImageLength: 4032
SensingMethod: 2
SceneType: 1
CustomRendered: 4
ExposureMode: 0
WhiteBalance: 0
FocalLengthIn35mmFormat: 29
SceneCaptureType: 0
LensSpecification: 83/20 (4.15), 83/20 (4.15), 11/5 (2.2), 11/5 (2.2)
LensMake: 'Apple'
LensModel: 'iPhone 6s back camera 4.15mm f/2.2'
Gps:
GPSLatitudeRef: 'N'
GPSLatitude: 13, 21, 3305/100 (33.05)
GPSLongitudeRef: 'E'
GPSLongitude: 75, 33, 2034/100 (20.34)
GPSAltitudeRef: 0
GPSAltitude: 83651/95 (880.537)
GPSTimeStamp: 12, 33, 57
GPSSpeedRef: 'K'
GPSSpeed: 21/100 (0.21)
GPSImgDirectionRef: 'T'
GPSImgDirection: 1654/31 (53.355)
GPSDestBearingRef: 'T'
GPSDestBearing: 1654/31 (53.355)
GPSDateStamp: '2016:05:08'
Unknown Tag (0x1f): 5
Sub: (jpegImageData)
Compression: 6
XResolution: 72
YResolution: 72
ResolutionUnit: 2
JpgFromRawStart: 1274
JpgFromRawLength: 8211
Photoshop (IPTC) metadata:
Date Created: 20160508
Time Created: 180357+0000
--------------------------------------------------------------------------------
GPSLatitudeRef: 'N'
GPSLatitude: 13, 21, 3305/100 (33.05)
GPSLongitudeRef: 'E'
GPSLongitude: 75, 33, 2034/100 (20.34)
GPS Description: [GPS. Latitude: 13 degrees, 21 minutes, 33.05 seconds N, Longitude: 75 degrees, 33 minutes, 20.34 seconds E]
GPS Longitude (Degrees East): 75.55565
GPS Latitude (Degrees North): 13.359180555555556
GPS Latitude: 13 degrees, 21 minutes, 33.05 seconds N
GPS Longitude: 75 degrees, 33 minutes, 20.34 seconds E
Fore More 请参阅此处的库文档
Maven Repo Link此处。
注意:此时它是 alpha 版本,但您可以信任 apache:D。
干杯!