Растровые метаданные.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.