MVC 5 获取相机制作的 Exif 数据

MVC 5 Get Exif data for Camera make

我正在尝试在文件上传中获取相机品牌、ISO 速度等的 Exif 数据。我可以获得一些标签(见下文),但需要一些有关从 Exif 目录中提取项目的指导。有什么建议吗

            IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(strFileName);
        foreach (var directory in directories)
            foreach (var tag in directory.Tags)
                System.Diagnostics.Debug.WriteLine(string.Format("Directory " + $"{directory.Name} - {tag.Name} = {tag.Description}"));

        var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
        var dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTime);
        System.Diagnostics.Debug.WriteLine(string.Format("dateTime " + dateTime));

        //
        Image img = Image.FromFile(strFileName);
        ImageFormat format = img.RawFormat;
        System.Diagnostics.Debug.WriteLine("Image Type : " + format.ToString());
        System.Diagnostics.Debug.WriteLine("Image width : " + img.Width);
        System.Diagnostics.Debug.WriteLine("Image height : " + img.Height);
        System.Diagnostics.Debug.WriteLine("Image resolution : " + (img.VerticalResolution * img.HorizontalResolution));
        System.Diagnostics.Debug.WriteLine("Image Pixel depth : " + Image.GetPixelFormatSize(img.PixelFormat));


        PropertyItem[] propItems = img.PropertyItems;
        int count = 0;
        ArrayList arrayList = new ArrayList();
        foreach (PropertyItem item in propItems)
        {
            arrayList.Add("Property Item " + count.ToString());
            arrayList.Add("iD: 0x" + item.Id.ToString("x"));
            System.Diagnostics.Debug.WriteLine("PropertyItem item in propItems: " + item.Id.ToString("Name"));
            count++;
        }

        ASCIIEncoding encodings = new ASCIIEncoding();
        try
        {
            string make = encodings.GetString(propItems[1].Value);
            arrayList.Add("The equipment make is " + make.ToString() + ".");
        }
        catch
        {
            arrayList.Add("no Meta Data Found");
        }

        ViewBag.listFromArray = arrayList;
        return View(await db.ReadExifs.ToListAsync());
    }

我知道有两个循环,很乱,但提供了一些输出:

Directory JPEG - Compression Type = Baseline
Directory JPEG - Data Precision = 8 bits
Directory JPEG - Image Height = 376 pixels
Directory JPEG - Image Width = 596 pixels
Directory JPEG - Number of Components = 3
Directory JPEG - Component 1 = Y component: Quantization table 0, Sampling factors 2 horiz/2 vert
Directory JPEG - Component 2 = Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
Directory JPEG - Component 3 = Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
Directory JFIF - Version = 1.1
Directory JFIF - Resolution Units = inch
Directory JFIF - X Resolution = 120 dots
Directory JFIF - Y Resolution = 120 dots
Directory JFIF - Thumbnail Width Pixels = 0
Directory JFIF - Thumbnail Height Pixels = 0
Directory File - File Name = FakeFoto03_large.Jpg
Directory File - File Size = 66574 bytes
Directory File - File Modified Date = Tue Jan 03 00:02:00 +00:00 2017
Image Type : [ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]
Image width : 596
Image height : 376
Image resolution : 14400
Image Pixel depth : 24

谢谢。 Y.

如果您正在处理的图像有相机品牌、ISO 等等,元数据提取器 将打印出来。您提供的图片不能包含这些细节。

感谢 Drew 的回复,现在可以正常工作了。虽然片段打印到屏幕上很好(160 个项目),但我无法将项目描述分配给变量或数组。这是代码:

            //    start exif ###############################
        var strFileName = Server.MapPath("~/uploads/" + fname + "_large" + extension);
        System.Diagnostics.Debug.WriteLine(">>> ReadExifsController, fname: " + fname);

        if (System.IO.File.Exists(strFileName))
        {
            System.Diagnostics.Debug.WriteLine(">>> ReadExifsController File exists.");
        }

        ArrayList arrayList = new ArrayList();
        arrayList.Add("ArrayList start");

        IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(strFileName);

foreach (var directory in directories)
            foreach (var tag in directory.Tags)
                System.Diagnostics.Debug.WriteLine(string.Format("Directory " + $"{directory.Name} - {tag.Name} = {tag.Description}"));
        count++;

        ViewBag.listFromArray = arrayList;
        return View(await db.ReadExifs.ToListAsync());
    }

已解决。这个区块:

            ArrayList arrayList = new ArrayList();

        IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(strFileName);
        foreach (var directory in directories)
            foreach (var tag in directory.Tags)
                //   System.Diagnostics.Debug.WriteLine(string.Format("Directory " + $"{directory.Name} - {tag.Name} = {tag.Description}"));
          arrayList.Add($"{tag.Name} = {tag.Description}");

        ViewBag.listFromArray = arrayList;
        return View(await db.ReadExifs.ToListAsync());

这会产生(在照片用作源的情况下)120 个 exif 标签。样本: 白平衡模式=自动白平衡

数码变焦比 = 1

焦距 35 = 28 毫米

场景捕捉类型 = 标准

增益控制 = 低增益向上

对比度=None