Java中读取图片分辨率最常用可靠方式是用ImageIO.read()获取BufferedImage后调用getWidth()和getHeight(),得到像素宽高;若仅需头信息可选metadata-extractor等库,DPI需通过元数据解析且与分辨率无关。

Java 中读取图片文件分辨率,最常用且可靠的方式是使用 javax.imageio.ImageIO 配合 BufferedImage 获取宽高,这等价于获取图片的像素级分辨率(如 1920×1080)。注意:这不是 DPI(每英寸点数)信息,而是图像固有的像素尺寸。
用 ImageIO 读取并获取宽高(推荐)
这是最简单、跨格式(JPEG/PNG/GIF/BMP 等)支持好、无需额外依赖的方法:
- 调用
ImageIO.read(File)或ImageIO.read(InputStream)得到BufferedImage - 直接调用
bufferedImage.getWidth()和bufferedImage.getHeight() - 即使图片损坏或不支持格式,
read()也会返回null,需判空处理
示例代码:
File file = new File("photo.jpg");
BufferedImage image = ImageIO.read(file);
if (image != null) {
int width = image.getWidth(); // 像素宽度
int height = image.getHeight(); // 像素高度
System.out.println(width + "x" + height);
}
仅读取头信息(不加载全图,适合大图)
如果只关心分辨率、不想占用内存加载整张图(比如处理 GB 级 TIFF 或高清扫描件),可用第三方库如 metadata-extractor 或 TwelveMonkeys ImageIO 解析图像头。原生 Java 不支持跳过解码直接读头。
立即学习“Java免费学习笔记(深入)”;
-
metadata-extractor可解析 JPEG/PNG/TIFF 的原始元数据,部分格式(如 JPEG)能快速拿到尺寸 - 对 PNG,其 IHDR 块开头就含宽高,解析前几十字节即可;但 Java 标准库不提供该能力
- 自行解析需按格式规范读二进制头,易出错,一般不建议除非有特殊性能要求
读取 DPI(非分辨率,但常被混淆)
DPI 是打印/显示密度信息,和像素分辨率无关,存储在元数据中(如 JPEG 的 EXIF、PNG 的 pHYs 块):
- 标准
ImageIO不提供 DPI 读取接口 - 可用
metadata-extractor获取:Directory中查找JpegDirectory.TAG_X_RESOLUTION等字段 - 注意:DPI 值可能缺失、为 0 或不准确,不能用于推算物理尺寸
常见问题提醒
避免踩坑的关键点:
-
不要用
ImageIcon.getIconWidth()—— 它可能返回 -1(未加载完成)或缩放后尺寸,不可靠 - 不要依赖文件名或路径中的“1080p”等字样 —— 完全不具权威性
- 读取网络图片时,确保
InputStream支持 mark/reset(ImageIO.read()内部可能需要重读流) - GIF 动画返回的是第一帧尺寸;若需各帧尺寸,需用
GIFImageReader扩展处理


















