位图Metadata.SetQuery不适用于Tiff图像

时间:2017-05-10 17:49:02

标签: c# .net exif system.drawing.imaging

我正在尝试使用System.Windows.Media。Imaging将Exif数据添加到图像中。我可以找到的大部分示例代码都适用于JPG,但不适用于Tiff。显然,代码无法扩展标题以添加新的Exif字段。任何想法下面的代码中缺少什么。输出JPG将在Exif中具有“焦距”和“纬度”值。但输出TIF不会。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Media.Imaging;

namespace TestExifCs
{
    class Program
    {

#define DO_TIFF
        static void RunSample(string originalPath)
        {

            BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile;

            uint paddingAmount = 2048; 

            using (Stream originalFile = File.Open(originalPath, FileMode.Open, FileAccess.Read))
            {
                BitmapDecoder original = BitmapDecoder.Create(originalFile, createOptions, BitmapCacheOption.None);
                // Pick the appropriate decoder.
#ifdef DO_TIFF
                string outputPath = @"C:\temp\out.tif";
                TiffBitmapEncoder output = new TiffBitmapEncoder();
#else
                string outputPath = @"C:\temp\out.jpg";
                JpegBitmapEncoder output = new JpegBitmapEncoder();
#endif

                if (original.Frames[0] != null && original.Frames[0].Metadata != null)
                {                       
                    BitmapMetadata metadata = original.Frames[0].Metadata.Clone() as BitmapMetadata;
                    // Expand the image file directory for new items.
                    metadata.SetQuery("/app1/ifd/PaddingSchema:Padding", paddingAmount);
                    metadata.SetQuery("/app1/ifd/exif/PaddingSchema:Padding", paddingAmount);

                    // Add focal length
                    byte[] f = new byte[8] { 0x70, 0x03, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00 };
                    metadata.SetQuery("/app1/ifd/exif/{uint=37386}", f);

                    // Add latitude
                    byte[] bArray = new byte[0x18] { 0x1d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0xd7, 0x04, 0x00, 0x10, 0x27, 0x00, 0x00 };
                    metadata.SetQuery("/app1/ifd/gps/subifd:{ulong=2}", bArray);

                    // Create a new frame identical to the one from the original image, except for the added metadata
                    output.Frames.Add(BitmapFrame.Create(original.Frames[0], original.Frames[0].Thumbnail, metadata, original.Frames[0].ColorContexts));
                }

                using (Stream outputFile = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite))
                {
                    output.Save(outputFile);
                }
            }
        }

        static void Main(string[] args)
        {
            RunSample("C:\\temp\\test.tif");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但我试图用System.Drawing.Image.SetPropertyItem()设置一个EXIF标签。在我看来,C#系统库只是不支持在TIFF中操作EXIF标签,就像在JPEG中一样。

TIFF格式在名为图像文件目录(IFD)的表中支持自己的一组标记。 IFD中的每个条目都有一个2字节"标记"定义条目是什么。我可以使用C#库编辑此表中的大多数条目:我可以使用"标记"来读/写条目。由TIFF格式定义(例如ImageWidth = 0x100),我可以使用任意"私有"来读/写条目。我自己组成的标签。

EXIF is supported in TIFF使用私有IFD条目" Type" =" Exif IFD" = 0x8769",其中包含新IFD的偏移量,其中包含所有EXIF特定的标记。虽然我可以阅读其他私人TIFF标签,但我无法检索到#34; Exif IFD"使用GetPropertyItem()的条目。我注意到有一些我不被允许阅读的TIFF标签,它们都是包含另一个IFD偏移的那种。

能够使用EXIF IFD标记编写 TIFF IFD条目。幸运的是,我试图写TIFF标签,而不是阅读它们,所以我通过手工操作来解决缺乏支持的问题。创建一个简单的EXIF IFD,将其附加到我的文件末尾,并编辑TIFF EXIF IFD条目以指向它。然后,Windows资源管理器可以从我的TIFF中读取EXIF。