Unity 读写JPG图像元数据 工具类的使用
  ZcJgkb1g5qMe 2023年11月02日 84 0

// 官方 EXIF 规范 V 2.32 https://exiv2.org/tags.html

使用方法:(只写了Set,Get相关数据的方法自行阅读使用. 使用到部分关键字已备注,未备注的关键字自行阅读官方规范进行翻译)

/// <summary>
/// 设置图像元数据
/// </summary>
/// <param name="imagePath">图像路径</param>
private void SetImageMetadata(string imagePath)
{
    if (imagePath == "")
    {
        Debug.LogError("路径不能为空");
        return;
    }

    ExifData imageExifData = new ExifData(imagePath);
    //--说明
    //图像描述
    imageExifData.SetTagValue(ExifTag.ImageDescription, imagePath, StrCoding.Utf8);
    //图像用户评论 备注
    imageExifData.SetTagValue(ExifTag.UserComment, "备注", StrCoding.Utf8);

    //--来源
    作者
    imageExifData.SetTagValue(ExifTag.Artist, "HH", StrCoding.Utf8);
    //拍摄时间
    DateTime originalTime = new DateTime(DateTime.Now.Ticks);
    imageExifData.SetTagValue(ExifTag.DateTimeOriginal, originalTime);
    //程序名称
    imageExifData.SetTagValue(ExifTag.Software,"Unity3D", StrCoding.Utf8);

    //--图像
    图像ID
    imageExifData.SetTagValue(ExifTag.ImageUniqueId, "123456", StrCoding.Utf8);
    压缩  https://exiftool.org/TagNames/EXIF.html#Compression
    imageExifData.SetTagValue(ExifTag.Compression, 2, ExifTagType.UShort);
    //分辨率单位 1 = 无    2 = 英寸  3 = 厘米
    imageExifData.SetTagValue(ExifTag.ResolutionUnit,1, ExifTagType.UShort);
    //颜色表示   0x1 = sRGB  0x2 = Adobe RGB 0xfffd = Wide Gamut RGB 0xfffe = ICC Profile    0xffff = Uncalibrated
    imageExifData.SetTagValue(ExifTag.ColorSpace, 0x1, ExifTagType.UShort);
    //压缩的位/像素
    ExifRational compressedBitsPerPixel = new ExifRational(100, 1000);
    imageExifData.SetTagValue(ExifTag.CompressedBitsPerPixel, compressedBitsPerPixel, ExifTagType.URational);

    //--照相机
    //照相机制造商
    imageExifData.SetTagValue(ExifTag.Make, "中国", StrCoding.Utf8);
    //照相机型号
    imageExifData.SetTagValue(ExifTag.Model, "中国相机", StrCoding.Utf8);
    //光圈值
    ExifRational fNumber = new ExifRational(80, 100);
    imageExifData.SetTagValue(ExifTag.FNumber, fNumber, ExifTagType.URational);
    //曝光时间
    ExifRational exposureTime = new ExifRational(1, 20);
    //ExifRational.FromDecimal(1.637m);
    imageExifData.SetTagValue(ExifTag.ExposureTime, exposureTime, ExifTagType.URational);
    //ISO速度
    imageExifData.SetTagValue(ExifTag.IsoSpeedRatings, 2, ExifTagType.UShort);
    //曝光补偿
    ExifRational exposureBiasValue = new ExifRational(10, 1000);
    imageExifData.SetTagValue(ExifTag.ExposureBiasValue, exposureBiasValue, ExifTagType.SRational);
    //焦距
    ExifRational focalLength = ExifRational.FromDecimal(10);
    imageExifData.SetTagValue(ExifTag.FocalLength, focalLength, ExifTagType.URational);
    //最大光圈
    ExifRational mxApertureValue = new ExifRational(20, 1000);
    imageExifData.SetTagValue(ExifTag.MaxApertureValue, mxApertureValue, ExifTagType.URational);
    //测光模式  0 = 未知  1 = 平均值 2 = 中心加权平均值 3 = 点   4 = 多点  5 = 多段  6 = 部分  255 = 其他
    imageExifData.SetTagValue(ExifTag.MeteringMode, 0, ExifTagType.UShort);
    //目标距离
    ExifRational subjectDistance = new ExifRational(10, 1000);
    imageExifData.SetTagValue(ExifTag.SubjectDistance, subjectDistance, ExifTagType.URational);
    //闪光灯模式 https://exiftool.org/TagNames/EXIF.html#Flash
    imageExifData.SetTagValue(ExifTag.Flash,0, ExifTagType.UShort);
    闪光灯能量
    ExifRational flashEnergy = new ExifRational(0, 1000);
    imageExifData.SetTagValue(ExifTag.FlashEnergy, flashEnergy, ExifTagType.URational);
    //35mm焦距
    imageExifData.SetTagValue(ExifTag.FocalLengthIn35mmFilm,2, ExifTagType.UShort);

    //--高级照片
    //对比度    0 = 正常  1 = 低   2 = 高
    imageExifData.SetTagValue(ExifTag.Contrast, 0, ExifTagType.UShort);
    亮度
    ExifRational brightnessValue = new ExifRational(300, 1000);
    imageExifData.SetTagValue(ExifTag.BrightnessValue, brightnessValue, ExifTagType.SRational);
    //光源    https://exiftool.org/TagNames/EXIF.html#LightSource
    imageExifData.SetTagValue(ExifTag.LightSource, 0, ExifTagType.UShort);
    //曝光程序  0 = 未定义 1 = 手动  2 = 程序自动曝光  3 = 光圈优先自动曝光    4 = 快门速度优先自动曝光  5 = 创意(慢速)  6 = 动作(高速)  7 = 人像  8 = 风景  9 = B门
    imageExifData.SetTagValue(ExifTag.ExposureProgram,0, ExifTagType.UShort);
    //饱和度    	0 = 正常  1 = 低   2 = 高
    imageExifData.SetTagValue(ExifTag.Saturation, 0, ExifTagType.UShort);
    //清晰度   0 = 正常  1 = 软  2 = 硬
    imageExifData.SetTagValue(ExifTag.Sharpness, 0, ExifTagType.UShort);
    //白平衡   0 = 自动  1 = 手动
    imageExifData.SetTagValue(ExifTag.WhiteBalance,0, ExifTagType.UShort);
    数字缩放(数码变焦倍率)
    ExifRational digitalZoomRatio = new ExifRational(0, 1000);
    imageExifData.SetTagValue(ExifTag.DigitalZoomRatio, digitalZoomRatio, ExifTagType.URational);
    //图像Exif版本
    imageExifData.SetTagValue(ExifTag.ExifVersion, "2030", StrCoding.Utf8);

    //--GPS
    //经纬度
    GeoCoordinate longitude = GeoCoordinate.FromDecimal((decimal)116.40286, false);
    imageExifData.SetGpsLongitude(longitude);
    GeoCoordinate latitude = GeoCoordinate.FromDecimal((decimal)39.93046, true);
    imageExifData.SetGpsLatitude(latitude);
    //高度
    imageExifData.SetGpsAltitude(100);

    try
    {
        //第一个参数DestFileNameWithPath是null或省略,该方法Save将覆盖现有的图像文件。也可以通过在参数中传递文件名来将图像另存为新文件名DestFileNameWithPath。
        imageExifData.Save();
        Debug.Log($"保存 {imagePath} Image元数据完成");
    }
    catch
    {
        Debug.LogError("文件被写保护 | 拒绝访问该文件 | 该文件不再可用,例如,它已被删除或卷已被移除。 | EXIF 数据太大。JPEG 中的最大 EXIF 数据大小为 65526 字节,TIFF 和 PNG 中为 2 GB。");
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

ZcJgkb1g5qMe