下面是一个Java代码示例,展示如何上传一张图片并分析其经纬度、颜色占比、分辨率、大小和拍摄日期。
首先引入Maven依赖
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.16.0</version>
</dependency>
Java代码示例
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.GpsDirectory;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import javax.imageio.ImageIO;
/**
* @Description: 图片分析
* @ClassName: ImageAnalyzer
* @Author: ceshi
* @Date: 2025/1/22 10:31
* @Version: 1.0
*/
public class ImageAnalyzer {
public static void main(String[] args) {
String imagePath = "D:\\test.jpg";
try {
// 读取图片
BufferedImage image = ImageIO.read(new File(imagePath));
// 获取分辨率
int width = image.getWidth();
int height = image.getHeight();
System.out.println("分辨率: " + width + "x" + height);
// 获取图片大小
File file = new File(imagePath);
long sizeInBytes = file.length();
double sizeInMB = (double) sizeInBytes / (1024 * 1024);
System.out.println("大小: " + sizeInMB + " MB");
// 获取拍摄日期(假设图片元数据包含拍摄日期,此处使用当前日期代替)
Date captureDate = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("拍摄日期: " + dateFormat.format(captureDate));
// 获取经纬度
Metadata metadata = ImageMetadataReader.readMetadata(file);
GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class);
if (gpsDirectory != null) {
double latitude = gpsDirectory.getGeoLocation().getLatitude();
double longitude = gpsDirectory.getGeoLocation().getLongitude();
System.out.println("经度: " + longitude);
System.out.println("纬度: " + latitude);
} else {
System.out.println("未找到GPS信息");
}
// 获取占比前三的颜色
Color[] topThreeColors = getTopThreeColors(image);
System.out.println("占比前三的颜色:");
for (Color color : topThreeColors) {
System.out.println("RGB: (" + color.getRed() + ", " + color.getGreen() + ", " + color.getBlue() + ")");
}
} catch (IOException e) {
e.printStackTrace();
} catch (ImageProcessingException e) {
e.printStackTrace();
}
}
/**
* 获取占比前三的颜色
* @param image
* @return
*/
private static Color[] getTopThreeColors(BufferedImage image) {
int[] colorCount = new int[256 * 256 * 256];
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
Color color = new Color(image.getRGB(x, y));
int index = (color.getRed() << 16) | (color.getGreen() << 8) | color.getBlue();
colorCount[index]++;
}
}
Integer[] indices = new Integer[colorCount.length];
for (int i = 0; i < colorCount.length; i++) {
indices[i] = i;
}
Arrays.sort(indices, new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return colorCount[i2] - colorCount[i1];
}
});
Color[] topThree = new Color[3];
for (int i = 0; i < 3; i++) {
int index = indices[i];
int red = (index >> 16) & 0xFF;
int green = (index >> 8) & 0xFF;
int blue = index & 0xFF;
topThree[i] = new Color(red, green, blue);
}
return topThree;
}
}
746

被折叠的 条评论
为什么被折叠?



