我正在尝试使用 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");
}
}
}