Brad Abrams конкретно предостерегает от Enum.IsDefined
в его сообщении Опасность Упрощения .
лучший способ избавиться от этого требования (то есть, потребность проверить перечисления) состоит в том, чтобы удалить пути, где пользователи могут понять его превратно, например, какое-то поле ввода. Используйте перечисления с холмами отбрасывания, например, для осуществления только допустимых перечислений.
Следующий код решает мою проблему и добавляет комментарии к заданному изображению JPEG:
public void addImageComment(string imageFlePath, string comments)
{
string jpegDirectory = Path.GetDirectoryName(imageFlePath);
string jpegFileName = Path.GetFileNameWithoutExtension(imageFlePath);
BitmapDecoder decoder = null;
BitmapFrame bitmapFrame = null;
BitmapMetadata metadata = null;
FileInfo originalImage = new FileInfo(imageFlePath);
if (File.Exists(imageFlePath))
{
// load the jpg file with a JpegBitmapDecoder
using (Stream jpegStreamIn = File.Open(imageFlePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
decoder = new JpegBitmapDecoder(jpegStreamIn, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
}
bitmapFrame = decoder.Frames[0];
metadata = (BitmapMetadata)bitmapFrame.Metadata;
if (bitmapFrame != null)
{
BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
if (metaData != null)
{
// modify the metadata
metaData.SetQuery("/app1/ifd/exif:{uint=40092}", comments);
// get an encoder to create a new jpg file with the new metadata.
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metaData, bitmapFrame.ColorContexts));
//string jpegNewFileName = Path.Combine(jpegDirectory, "JpegTemp.jpg");
// Delete the original
originalImage.Delete();
// Save the new image
using (Stream jpegStreamOut = File.Open(imageFlePath, FileMode.CreateNew, FileAccess.ReadWrite))
{
encoder.Save(jpegStreamOut);
}
}
}
}
}
По сути, это слегка измененная версия кода, найденного по ссылке, любезно предоставленной Konamiman.
Имейте в виду, что для выполнения этой работы вам необходимо добавить ссылки .NET на PresentationCore и WindowsBase . При использовании Visual Studio 2008 это может быть достигнуто следующим образом:
Щелкните правой кнопкой мыши свой проект в обозревателе решений
В раскрывающемся списке выберите «Добавить ссылку ...»
В новом поле В открывшемся окне выберите вкладку «.NET».
Прокрутите до двух упомянутых выше ссылок и для каждой нажмите «ОК».
Большое спасибо danbystrom и Konamiman за вашу помощь в этом вопросе. Я очень ценю быстрый ответ.
Простая часть:
Добавьте этот элемент свойства:
var data = System.Text.Encoding.UTF8.GetBytes( "Some comments" );
PropertyItem pi;
*** create an empty PropertyItem here
pi.Type = 2;
pi.Id = 37510;
pi.Len = data.Length;
pi.Value = data;
В коллекцию PropertItems изображения.
Несколько более громоздкая часть: Как создать новый PropertyItem, если у него нет общедоступного конструктора?
Распространенный «трюк» состоит в том, чтобы иметь пустое изображение, из которого вы можете украсть PropertyItem. вздох