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