User 7429338 Ответов: 1

Сохранить описание изображения в PNG файл мета-данных


Я пытаюсь сохранить описание изображения в PNG-файле с помощью PropertyItem. Это не дает мне никаких ошибок, и изображение успешно сохраняется. Однако при повторном чтении он, по-видимому, не содержит описания изображения. Открытие файла в GIMP также не показывает описание изображения.

Что я делаю не так?

Что я уже пробовал:

Мой код для сохранения PNG-это:
using (var bitmap = TakePicture()) {
	var imageDescription = "Description of this image";
	var propertyItem = (PropertyItem)FormatterServices.GetUninitializedObject(typeof(PropertyItem));
	propertyItem.Id = 0x010E;     // Image description. See https://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.id(v=vs.110).aspx
	propertyItem.Type = 1;        // A byte array. See https://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.type(v=vs.110).aspx
	propertyItem.Value = Encoding.ASCII.GetBytes(imageDescription);
	propertyItem.Len = propertyItem.Value.Length;
	bitmap.SetPropertyItem(propertyItem);

	bitmap.Save(filename);
}


Мой код для чтения его обратно таков:
var bitmap = (Bitmap)Image.FromFile(filename);
var propertyItem = bitmap.GetPropertyItem(0x010E);
var imageDescription = Encoding.ASCII.GetString(propertyItem.Value);

Что создает исключение Система.Значение свойства не может быть найдено..

1 Ответов

Рейтинг:
8

Richard Deeming

Один PropertyItem объект используется для извлечения и изменения метаданных существующих файлов изображений, не создавать метаданные Таким образом, PropertyItem класс не имеет определенного открытого конструктора, и вы не можете создать экземпляр класса. PropertyItem объект.

Чтобы обойти отсутствие открытого конструктора, используйте существующий конструктор. PropertyItem объект вместо создания нового экземпляра объекта PropertyItem класс. Для получения дополнительной информации см. Изображение.GetPropertyItem[^].
Трудно установить элементы свойств, потому что класс PropertyItem не имеет открытых конструкторов. Один из способов обойти это ограничение-получить PropertyItem, получив значение свойства PropertyItems или вызвав метод GetPropertyItem изображения, которое уже имеет элементы свойств. Затем вы можете установить поля объекта PropertyItem и передать его в SetPropertyItem.

Документация, по-видимому, подразумевает, что вы не можете установить свойства, если они не существуют в первую очередь.

Библиотеки изображений WPF, похоже, поддерживают его:
Как записать метаданные в растровое изображение | Microsoft Docs[^]

Или вы можете использовать альтернативную библиотеку - например:
GitHub - mono/taglib-sharp: библиотека для чтения и записи метаданных в медиафайлы[^]


[no name]

Спасибо, вы правы! Библиотека изображений WPF выполняет эту работу.