如何获取图片的信息(包括dpi) 【前端js 后台java window系统】

本文探讨了在JavaScript和PHP中获取图片DPI信息的方法,包括读取二进制流、利用exif信息和Java图像处理库Sanselan。介绍了如何在不同场景下选择合适的方法,并提供了相关代码示例。

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

方法一:图片二进制(正在亲测,未得出结果)

据说DPI信息在jpg文件中用5个字节表示,直接读取二进制流就可以了

偏移 13 的1个字节:
X和Y的密度单位
units=0:无单位
units=1:点数/英寸
units=2:点数/厘米

偏移15的2字节:
水平方向像素密度

偏移16的2字节:
垂直方向像素密度

然而用js读二进制太扯了。。。
这得吃点内存的

//PHP读取图片二进制
<?php
    $image   = "compileType.png"; //图片地址
    $fp      = fopen($image, 'rb');
    $content = fread($fp, filesize($image)); //二进制数据
    $er = bindec($content);  // 二进制转换为十进制
    echo decbin($er);   //十进制转换为二进制显示
    //方法上来说貌似没有问题,但是结果令人觉得奇怪,先记下这问题
?>

结果为:11110001110111011111001011010101

结果太短了,和上面说的字节对不上??

 

 

方法二:读取图片exif信息(注意只有相机才能保证有exif信息,手机拍摄不一定有。具体有没有exif信息可以用方法四检查下详细信息--“exif版本”那里有没有值)

前端JavaScript:exif.js读取图像的元数据  http://code.ciaoca.com/javascript/exif-js/demo/  

实际操作时要加上检测网页是否加载完成 window.onload = function(){}  。 img标签src要转成base64编码或者用cdn加速图片位置,不能用本地图片(貌似是这样)。exif信息不存在的话, EXIF.getAllTags()的值为{},EXIF.pretty()为undefined

百度网盘地址:链接:https://pan.baidu.com/s/1bGxSoRNkcDzSDm1VFj03CQ 密码:8rof

后台java:获取照片信息---Java与图像的EXIF信息   http://yijianfengvip.blog.163.com/blog/static/1752734322010103084230677

工具地址:https://github.com/drewnoakes/metadata-extractor

 

方法三:Java图像处理库 Sanselan(现改为Commons Imaging)

Sanselan 是一个纯 Java 的图形库,由Apache 组织开发,可以读写各种格式的图像文件,包括快速解析各种图片(jpg,png,gif等都支持)信息例如大小/颜色/icc以及元数据等。尽管因为是Java开发的,在处理速度上会稍微慢一 些,但具备良好的可移植性。现已发布1.0 版本(改名为Commons Imaging),

本人测试手机图片都会读取到 -1 ,手动另存一下的话就能正常读取。

下载位置:http://commons.apache.org/proper/commons-imaging/

百度网盘地址:链接:https://pan.baidu.com/s/1IVKBG1JHgP50WpUufM2sAg 密码:c278

API文档:http://commons.apache.org/proper/commons-imaging/apidocs/index.html

package test;

import java.io.File;
import java.io.IOException;

import org.apache.commons.imaging.ImageInfo;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.Imaging;

public class ImageInfoTest {
	public static void main(String[] args) throws ImageReadException, IOException {
		ImageInfo imageInfo = 
				Imaging.getImageInfo(
						new File("C:\\Users\\chanye1\\Desktop\\ever.jpg"));
		
		System.out.println(imageInfo);    //输出可以读取的图片属性
		System.out.println("该图片dpi为:"+imageInfo.getPhysicalHeightDpi()); //输出图片dpi
	}
}

输出结果:

Format Details: Jpeg/JFIF v.1.1
Bits Per Pixel: 24
Comments: 0
Format: JPEG
Format Name: JPEG (Joint Photographic Experts Group) Format
Compression Algorithm: JPEG
Height: 2327
MimeType: image/jpeg
Number Of Images: 1
Physical Height Dpi: 200
Physical Height Inch: 11.635
Physical Width Dpi: 200
Physical Width Inch: 8.255
Width: 1651
Is Progressive: false
Is Transparent: false
Color Type: YCbCr
Uses Palette: false

该图片dpi为:200

备注:eclipse快捷键ctrl+o一键导包

 

方法四:window系统查看(jpg才能读到dpi)

 

 

 

Java获取图片DPI(每英寸点数,即分辨率)通常不是直接内置的功能,因为DPI信息并不总是保存在图像文件本身。然而,如果你处理的是位图(Bitmap),你可以通过查看元数据来尝试获取这个信息。对于某些特定的图片格式,如JPG、PNG等,它们可能会包含EXIF(Exchangeable Image File Format)元数据,其中就包含了DPI信息。 以下是一个基本的例子,展示如何使用`javax.imageio.ImageIO`和`javax.imageio.metadata`包来读取JPEG图片的EXIF信息,虽然不是所有图片都支持这种方式: ```java import javax.imageio.ImageIO; import javax.imageio.metadata.IIOMetadata; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class Main { public static void main(String[] args) { try { File imageFile = new File("path_to_your_image.jpg"); BufferedImage img = ImageIO.read(imageFile); IIOMetadata metadata = ImageIO.getImageReadMetadata(img); if (metadata != null) { // 找到Exif MakerNote节并解析DPI信息 ExifReader reader = new ExifReader(imageFile); TIFFDirectory dir = (TIFFDirectory) metadata.getIIOMetadataFormatName().equals("javax_imageio_tiff_1.0") ? (TIFFDirectory) metadata.getAsTree(metadata.getNativeMetadataFormatName()) : null; if (dir != null) { float xResolution = dir.getXResolution(); float yResolution = dir.getYResolution(); double dpiX = xResolution * 72; // 英寸转换因子 double dpiY = yResolution * 72; System.out.println("Image DPI: (" + dpiX + ", " + dpiY + ")"); } else { System.out.println("No EXIF data found or not supported for this format."); } } else { System.out.println("No metadata found."); } } catch (IOException e) { e.printStackTrace(); } } } ``` 注意,这只是一个示例,并非所有DPI信息都能从所有的图像文件中获取,而且解析EXIF可能需要额外的库,如`exifread`。此外,不是所有的DPI都是整数值,所以结果可能是浮点数。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值