Растровые метаданные.SetQuery не работает на изображениях Tiff

Я пытаюсь добавить данные Exif к изображениям, используя System. Windows. Media. Imaging. Большинство примеров кодов, которые я могу найти для 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 ответ

Я столкнулся с той же проблемой, но я пытался установить тег EXIF ​​с System.Drawing.Image.SetPropertyItem(). Мне кажется, что библиотеки C# System просто не поддерживают манипулирование тегами EXIF ​​в TIFF так же, как в JPEG.

Формат TIFF поддерживает собственный набор тегов в таблице, называемой каталогом файлов изображений (IFD). Каждая запись в IFD имеет 2-байтовый "тег", определяющий, что это за запись. Я могу редактировать большинство записей в этой таблице с помощью библиотек C#: я могу читать / писать записи с "Тегами", определенными форматом TIFF (например, ImageWidth=0x100), и я могу читать / писать записи с произвольными "частными" тегами, которые Я делаю макияж самостоятельно.

EXIF поддерживается в TIFF с помощью частной записи IFD с "Type" = "Exif IFD" = 0x8769", которая содержит смещение к новому IFD, содержащему все специфичные для EXIF ​​теги. Хотя я могу читать другие частные теги TIFF, Я не могу получить запись "Exif IFD" с помощью GetPropertyItem(). Я заметил, что было несколько тегов TIFF, которые мне не разрешали читать, и все они были такого рода, которые содержали смещение к другому IFD.

Мне удалось написать запись TIFF IFD с тегом EXIF ​​IFD. К счастью, я пытался писать теги TIFF, а не читать их, поэтому я обошел проблему отсутствия поддержки, делая это вручную; создание простого EXIF ​​IFD, добавление его в конец моего файла и редактирование записи TIFF EXIF ​​IFD для указания на нее. Затем проводник Windows смог прочитать EXIF-файлы из моего TIFF.

Другие вопросы по тегам