图片压缩工具 | 图片属性详解及读取解析元数据

news2025/7/24 4:40:15

ℹ️ 图片信息及属性

基本属性

  1. 格式类型:JPEG、PNG、GIF、WEBP、BMP、TIFF等
  2. 文件大小:以KB、MB等为单位的存储空间占用
  3. 创建/修改日期:文件的元数据时间戳

视觉属性

  1. 尺寸/分辨率

    • 宽度(像素)
    • 高度(像素)
    • PPI/DPI(每英寸像素数,影响打印质量)
  2. 色彩属性

    • 色彩模式:RGB、CMYK、灰度等
    • 色深/位深:8位、16位、24位等
    • 透明度(Alpha通道):PNG支持,JPEG不支持
  3. 质量属性

    • 压缩率(JPEG等有损格式)
    • 噪点/伪影程度

元数据

EXIF/标准元数据

EXIF(Exchangeable Image File Format,可交换图像文件格式)是嵌入在图片文件中的元数据,主要记录拍摄参数、设备信息、时间、位置等数据。以下是常见 EXIF 信息分类:

✅一、拍摄参数类

属性含义
ExposureTime曝光时间(如 1/60 秒)
FNumber光圈值(如 f/2.8)
ISOSpeedRatingsISO 感光度(如 100、400)
FocalLength焦距(如 35mm)
Flash是否使用闪光灯
MeteringMode测光模式
WhiteBalance白平衡设置

✅ 二、时间与位置

属性含义
DateTimeOriginal拍摄时间
CreateDate文件创建时间(不一定等于拍摄)
GPSLatitudeGPS 纬度(如有)
GPSLongitudeGPS 经度(如有)
GPSAltitude海拔

✅ 三、设备信息

属性含义
Make相机/手机制造商(如 Apple)
Model设备型号(如 iPhone 14)
LensModel镜头型号(如 EF 50mm)
Software拍摄时使用的软件版本

✅ 四、图片属性

属性含义
ImageWidth图片宽度
ImageHeight图片高度
Orientation拍摄方向(横竖)
ColorSpace色彩空间(sRGB 等)
Compression压缩方式
Thumbnail缩略图数据(如有)

ICC/色彩管理的核心

ICC(International Color Consortium,国际色彩联盟)元数据是嵌入在图像文件中的色彩管理数据,用于确保不同设备(相机、显示器、打印机)呈现的色彩一致性。

XMP/图像的可扩展元数据

XMP(Extensible Metadata Platform,可扩展元数据平台)是 Adobe 开发的一种标准化元数据格式,用于嵌入到图片、视频、PDF 等文件中。它比 EXIF 更灵活,支持自定义字段和结构化数据。

对比

📌 XMP vs EXIF vs ICC

特性XMPEXIFICC
格式XML 文本二进制数据二进制配置文件
扩展性⭐⭐⭐⭐(可自定义)⭐⭐(固定字段)⭐(固定色彩模型)
主要用途编辑元数据、版权相机参数、时间色彩管理
编辑工具Photoshop、ExifTool相机、ExifToolPhotoshop、ColorSync

📖 用代码读取图片属性

sharp.js 提供 metadata 方法用于读取图片的信息(详见官网文档)。sharp 本身不能直接读取到 EXIF 信息(返回的是 Buffer 对象),需要专门的工具进行解析,如ExifReader、exifr、exif-parser、exif-js。

四个常用库对比图(截止2025年6月)

特性 / 库ExifReaderexifrexif-parserexif-js
✅ 解析精度⭐⭐⭐⭐ 高(专业级)⭐⭐⭐⭐ 高⭐⭐ 中等(基础字段)⭐⭐ 中等(部分支持)
📦 支持格式JPEG, TIFF, WebP 等JPEG, HEIC, TIFF, WebPJPEGJPEG
🌐 平台支持浏览器 + Node.js浏览器 + Node.jsNode.js(专用)浏览器专用
🛠 支持 GPS / IPTC❌(无 GPS/IPTC)✅(部分支持)
🧱 输出结构化对象✅(字段清晰)❌(手动解析)❌(字段杂乱)
⚡ 性能⭐⭐⭐ 中等⭐⭐⭐⭐ 快⭐⭐⭐⭐ 快(轻量)⭐⭐ 慢(同步)
📅 更新活跃✅(持续更新)✅(活跃)⚠ 停止维护(多年)❌(基本弃用)
📦 包体积小(~20KB)非常小(~6KB)

在项目中我选用exifr库。

元数据展示/VUE

<template>
    <n-scrollbar :style="{ maxHeight: height }">
        <n-table size="small" :bordered="false" striped>
            <thead>
                <tr>
                    <th width="200px">属性名</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(value, key) in data">
                    <td>
                        <n-tooltip>
                            <template #trigger>{{ key }}</template>
                            {{ getCNName(key) }}
                        </n-tooltip>
                    </td>
                    <td>{{ value }}</td>
                </tr>
            </tbody>
        </n-table>
    </n-scrollbar>
</template>

<script setup>
    import { NTable, NTooltip, NScrollbar } from 'naive-ui'

    const props = defineProps({
        data:{type:Object},
        height:{type: String, default: "500px" }
    })

    const cnNames = (()=>{
        const names = {
            CompositeImage : "合成图像",
            OffsetTimeOriginal: "拍摄原始日期时区",
            OffsetTimeDigitized: "拍摄原始日期时区",
            FocalLenIn35mmFilm:"描述数码相机或镜头在模拟35mm胶片时的焦距效果",
            PhotographicSensitivity:"相机灵敏度",
            LensMake:"镜头制造商",
            LensSpecification: "镜头规格",
            ISO: "感光度设置",
            ExposureCompensation:"曝光补偿",
            FocalLengthIn35mmFormat: "镜头焦距在35mm全画幅相机上的等效值‌",
            LensInfo: "镜头信息",
            OffsetTime: "时区偏移量",

            "ExifVersion": "Exif 版本",
            "FlashPixVersion": "FlashPix 版本",
            "ColorSpace": "色域、色彩空间",
            "PixelXDimension": "图像的有效宽度",
            "PixelYDimension": "图像的有效高度",
            "ComponentsConfiguration": "图像构造",
            "CompressedBitsPerPixel": "压缩时每像素色彩位",
            "MakerNote": "制造商设置的信息",
            "UserComment": "用户评论",
            "RelatedSoundFile": "关联的声音文件",
            "DateTimeOriginal": "创建时间",
            "DateTimeDigitized": "数字化创建时间",
            "SubsecTime": "日期时间(秒)",
            "SubSecTimeOriginal": "原始日期时间(秒)",
            "SubsecTimeDigitized": "原始日期时间数字化(秒)",
            "ExposureTime": "曝光时间",
            "FNumber": "光圈值",
            "ExposureProgram": "曝光程序",
            "SpectralSensitivity": "光谱灵敏度",
            "ISOSpeedRatings": "感光度",
            "OECF": "光电转换功能",
            "ShutterSpeedValue": "快门速度",
            "ApertureValue": "镜头光圈",
            "BrightnessValue": "亮度",
            "ExposureBiasValue": "曝光补偿",
            "MaxApertureValue": "最大光圈",
            "SubjectDistance": "物距",
            "MeteringMode": "测光方式",
            "Lightsource": "光源",
            "Flash": "闪光灯",
            "SubjectArea": "主体区域",
            "FocalLength": "焦距",
            "FlashEnergy": "闪光灯强度",
            "SpatialFrequencyResponse": "空间频率反应",
            "FocalPlaneXResolution": "焦距平面X轴解析度",
            "FocalPlaneYResolution": "焦距平面Y轴解析度",
            "FocalPlaneResolutionUnit": "焦距平面解析度单位",
            "SubjectLocation": "主体位置",
            "ExposureIndex": "曝光指数",
            "SensingMethod": "图像传感器类型",
            "FileSource": "源文件",
            "SceneType": "场景类型(1 == 直接拍摄)",
            "CFAPattern": "CFA 模式",
            "CustomRendered": "自定义图像处理",
            "ExposureMode": "曝光模式",
            "WhiteBalance": "白平衡(1 == 自动,2 == 手动)",
            "DigitalZoomRation": "数字变焦",
            "FocalLengthIn35mmFilm": "35毫米胶片焦距",
            "SceneCaptureType": "场景拍摄类型",
            "GainControl": "场景控制",
            "Contrast": "对比度",
            "Saturation": "饱和度",
            "Sharpness": "锐度",
            "DeviceSettingDescription": "设备设定描述",
            "SubjectDistanceRange": "主体距离范围",
            "InteroperabilityIFDPointer": "",
            "ImageUniqueID": "图像唯一ID",
            "ImageWidth": "图像宽度",
            "ExifImageWidth" : "图像宽度",
            "ImageHeight": "图像高度",
            "ExifImageHeight": "图像高度",
            "BitsPerSample": "比特采样率",
            "Compression": "压缩方法",
            "PhotometricInterpretation": "像素合成",
            "Orientation": "拍摄方向",
            "SamplesPerPixel": "像素数",
            "PlanarConfiguration": "数据排列",
            "YCbCrSubSampling": "色相抽样比率",
            "YCbCrPositioning": "色相配置",
            "XResolution": "X方向分辨率",
            "YResolution": "Y方向分辨率",
            "ResolutionUnit": "分辨率单位",
            "StripOffsets": "图像资料位置",
            "RowsPerStrip": "每带行数",
            "StripByteCounts": "每压缩带比特数",
            "JPEGInterchangeFormat": "JPEG SOI 偏移量",
            "JPEGInterchangeFormatLength": "JPEG 比特数",
            "TransferFunction": "转移功能",
            "WhitePoint": "白点色度",
            "PrimaryChromaticities": "主要色度",
            "YCbCrCoefficients": "颜色空间转换矩阵系数",
            "ReferenceBlackWhite": "黑白参照值",
            "DateTime": "日期和时间",
            "ImageDescription": "图像描述、来源",
            "Make": "相机/手机制造商(如 Apple)",
            "Model": "设备型号",
            "Software": "拍摄时使用的软件(手机系统)版本",
            "Artist": "作者",
            "Copyright": "版权信息",
            "GPSVersionID": "GPS 版本",
            "GPSLatitudeRef": "南北纬",
            "GPSLatitude": "纬度",
            "GPSLongitudeRef": "东西经",
            "GPSLongitude": "经度",
            "GPSAltitudeRef": "海拔参照值",
            "GPSAltitude": "海拔",
            "GPSTimeStamp": "GPS 时间戳",
            "GPSSatellites": "测量的卫星",
            "GPSStatus": "接收器状态",
            "GPSMeasureMode": "测量模式",
            "GPSDOP": "测量精度",
            "GPSSpeedRef": "速度单位",
            "GPSSpeed": "GPS 接收器速度",
            "GPSTrackRef": "移动方位参照",
            "GPSTrack": "移动方位",
            "GPSImgDirectionRef": "图像方位参照",
            "GPSImgDirection": "图像方位",
            "GPSMapDatum": "地理测量资料",
            "GPSDestLatitudeRef": "目标纬度参照",
            "GPSDestLatitude": "目标纬度",
            "GPSDestLongitudeRef": "目标经度参照",
            "GPSDestLongitude": "目标经度",
            "GPSDestBearingRef": "目标方位参照",
            "GPSDestBearing": "目标方位",
            "GPSDestDistanceRef": "目标距离参照",
            "GPSDestDistance": "目标距离",
            "GPSProcessingMethod": "GPS 处理方法名",
            "GPSAreaInformation": "GPS 区功能变数名",
            "GPSDateStamp": "GPS 日期",
            "GPSDifferential": "GPS 修正"
        }

        return Object.fromEntries(Object.keys(names).map(key=>[key.toLowerCase(), names[key]]))
    })();

    const getCNName = (key="")=> cnNames[key.toLowerCase()] || key
</script>

效果演示

✍️ 修改图片属性(规划ING)

未来有需要再加上(可以通过 sharp.js 写入 metadata )😄。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2400649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# Onnx 动漫人物人脸检测

目录 效果 模型信息 项目 代码 下载 参考 效果 模型信息 Model Properties ------------------------- stride&#xff1a;32 names&#xff1a;{0: face} --------------------------------------------------------------- Inputs ------------------------- name&am…

C++内存列传之RAII宇宙:智能指针

文章目录 1.为什么需要智能指针&#xff1f;2.智能指针原理2.1 RAll2.2 像指针一样使用 3.C11的智能指针3.1 auto_ptr3.2 unique_ptr3.3 shared_ptr3.4 weak_ptr 4.删除器希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 智能指针是 C 中用于自动…

PVE 虚拟机安装 Ubuntu Server V24 系统 —— 一步一步安装配置基于 Ubuntu Server 的 NodeJS 服务器详细实录1

前言 最近在基于 NodeJS V22 写一个全栈的项目&#xff0c;写好了&#xff0c;当然需要配置服务器部署啦。这个过程对于熟手来说&#xff0c;还是不复杂的&#xff0c;但是对于很多新手来说&#xff0c;可能稍微有点困难。所以&#xff0c;我把整个过程全部记录一下。 熟悉我…

TDengine 开发指南——高效写入

高效写入 本章内容将介绍如何发挥 TDengine 最大写入性能&#xff0c;通过原理解析到参数如何配置再到实际示例演示&#xff0c;完整描述如何达到高效写入。 为帮助用户轻松构建百万级吞吐量的数据写入管道&#xff0c;TDengine 连接器提供高效写入的特性。 启动高效写入特性…

Linux kill 暂停命令

暂停进程 kill -19 在一台服务器上部署了360Pika服务&#xff0c;先用RedisClient连接一下&#xff0c;可以连接 现在暂停进程 暂停后发现再次连接无法连接 恢复进程 kill -18 恢复后可连接

2.0 阅读方法论与知识总结

引言 本文将详细分析考研英语阅读做题步骤&#xff0c;并对方法论进行总结&#xff0c;最后通过真题练习巩固方法。 一、做题步骤 所有技巧都建立在精读真题的基础上&#xff01;建议按以下节奏复习&#xff1a; 1️⃣ 做题 先看题干了解文章大致主旨&#xff08;看看有没有…

5. Qt中.pro文件(1)

本节主要讲.pro文件的作用和一些相关基础知识与操作。 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 PRO文件 1.1 pro文件作用 添加需要用到的QT模块&#xff0c;如通过QT module_name来添加需要用到的Qt模块。指定生…

简数采集技巧之快速获取特殊链接网址URL方法

简数采集器列表页提取器的默认配置规则&#xff1a;获取a标签的href属性值作为采集的链接网址&#xff0c;对于大部分网站都是适用的&#xff1b; 但有些网站不使用a标签作为链接跳转&#xff0c;而用javascript的onclick事件替代&#xff0c;那列表页提取器的默认规则将无法获…

AI 如何改变软件文档生产方式?

现代软件工程中的文档革命&#xff1a;从附属品到核心组件的范式升级 在数字化转型浪潮席卷全球的当下&#xff0c;软件系统的复杂度与规模呈现指数级增长。据Gartner最新研究显示&#xff0c;超过67%的企业软件项目延期或超预算的根本原因可追溯至文档系统的缺陷。这一现象在…

激光干涉仪:解锁协作机器人DD马达的精度密码

在工业4.0的浪潮中&#xff0c;协作机器人正以惊人的灵活性重塑生产线——它们与工人并肩作业&#xff0c;精准搬运零件&#xff0c;完成精密装配。还能协同医生完成手术&#xff0c;甚至制作咖啡。 标准的协作机器人关节模组由角度编码器、直驱电机(DD马达)、驱动器、谐波减速…

HOPE800系列变频器安装到快速调试的详细操作说明

以下是HOPE800系列变频器从安装到调试的详细操作说明及重要参数设置&#xff0c;适用于工程技术人员或具备电气基础的操作人员。请严格遵循安全规范操作。 以下面电机铭牌为例&#xff1a; HOPE800变频器安装与调试指南** &#xff08;安全第一&#xff01;操作前务必断电并确…

vCenter与ESXi主机每分钟周期性断连修复

问题概述 最近我的测试服务器借给客户用作临时中转&#xff0c;仅更改了ESXi的管理IP&#xff0c;设备拿回来改回原来IP&#xff0c;vCenter开启后重新接收证书&#xff0c;主机和所有VM管理运行正常&#xff0c;跑着跑着发现主机和vCenter会频繁断开连接后又马上自动恢复&…

web3-区块链困境破解指南:从数字化签名到Rollup 到分片

web3-区块链三难困境破解指南&#xff1a;从数字化签名到Rollup 到分片 数字化签名 实体的签名&#xff1a;将交易和签名者绑定在一起 在数字世界的问题是&#xff1a; 任何人都可以从任一文档复制Bob的签名放到自己想放的地方。 解决方案&#xff1a;让签名由文件来决定 b…

李飞飞World Labs开源革命性Web端3D渲染器Forge!3D高斯溅射技术首次实现全平台流畅运行

在AI与3D技术深度融合的今天&#xff0c;李飞飞领衔的World Labs团队再次成为行业焦点。今日&#xff0c;他们正式开源了Forge——一款专为Web端设计的3D高斯溅射&#xff08;3D Gaussian Splatting&#xff09;渲染器&#xff0c;不仅支持THREE.js生态&#xff0c;更能在手机、…

小鹏汽车5月交付新车33525台 同比增长230%

6月1日&#xff0c;小鹏汽车公布5月交付数据&#xff0c;5月小鹏交付新车33,525台&#xff0c;同比增长230%&#xff0c;与4月交付35,045台相比下降4.3%&#xff0c;已连续7个月交付量突破30,000台。2025年1-5月&#xff0c;小鹏汽车累计交付新车162,578台&#xff0c;同比增长…

OpenCV——Mat类及常用数据结构

Mat类及常用数据结构 一、Mat类简介1.1、矩阵头1.2、矩阵的数据类型1.3、Mat的子类 二、矩阵数据的存储2.1、单通道2.2、多通道 三、创建矩阵的方法3.1、静态方法创建3.2、构造方法创建3.3、读取图像文件创建3.4、克隆创建 四、获取矩阵信息五、矩阵相关操作5.1、获取/修改像素…

每天总结一个html标签——Audio音频标签

Audio标签 文章目录 Audio标签一、audio标签的定义与介绍1. 定义介绍2. 语法3. 支持的格式4.文本提示 二、audio标签的HTML属性1. autoplay2. loop3. muted4. preload 三、audio标签的常用DOM属性四、audio标签的常用事件四、默认样式五、自定义样式1. 示例2. 代码 六、播放 m3…

web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲

web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲 一、使用Remix演示智能合约部署 智能合约的代码编写一般都是在Remix上&#xff0c;Remix的好处的话就是可以在浏览器中快速开发和部署合约&#xff0c;无需在本地安装任何程序&#xff0c;十分适合新手。 对应…

网络编程及原理(一)

目录 一 . 独立模式与网络互联 二 . 局域网 —— LAN &#xff08;1&#xff09;基于网线直连 &#xff08;2&#xff09;基于集线器组建 &#xff08;3&#xff09;基于交换机组建 &#xff08;4&#xff09;基于交换机和路由器组建 三 . 广域网 —— WAN 四 …

【Linux】进程 信号保存 信号处理 OS用户态/内核态

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、信号保存 ✨进程如何完成对信号的保存&#xff1f; ✨在内核中的表示 ✨sigset_t ✨信号操作函数 &#x1fa84;sigprocmask --- 获取或设置当前进程的 block表 &#x1fa84;s…