Установка значения System::Drawing::Imaging::PropertyItem^

Я хотел бы дать своему растровому изображению значение PropertyItem, но я не совсем уверен, как дать ему значение System::String^.

System::Drawing::Imaging::PropertyItem^ propItem = gcnew System::Drawing::Imaging::PropertyItem;
System::String^ newValue = gcnew System::String("newValue");

propItem->Id = PropertyTagImageTitle;
propItem->Len = 9;
propItem->Type = PropertyTagTypeASCII;
propItem->Value = newValue;
bmp->SetPropertyItem(propItem);

"System:: Drawing:: Imaging:: PropertyItem:: Value:: set" нельзя вызвать с данным списком аргументов."Типы аргументов: (System::String^) Тип объекта: System::Drawing::Imaging::PropertyItem^

Ответ Ханса Пассанта правильный. Я реализовал это следующим образом:

System::Drawing::Image^ theImage = System::Drawing::Image::FromFile("C:\\image.png");
System::Text::Encoding^ utf8 = System::Text::Encoding::UTF8;
array<System::Drawing::Imaging::PropertyItem^>^ propItem = theImage->PropertyItems;
System::String^ newValue = gcnew System::String("newValue");
propItem->Id = PropertyTagImageTitle;
propItem[0]->Len = 18;
propItem->Type = PropertyTagTypeByte;

array<Char>^propItemValue = newValue->ToCharArray();
array<byte>^ utf8Bytes = utf8->GetBytes(propItemValue);
propItem[0]->Value = utf8Bytes;
theImage->SetPropertyItem(propItem[0]);

1 ответ

Решение

Тип свойства Value array<Byte>^, Это может быть что угодно. Но требуется преобразование, и для строки вы должны сильно беспокоиться о кодировке, которую вы используете.

Документы MSDN и PropertyTagTypeASCII не скрывает, вы должны использовать Encoding::ASCII, чтобы сделать преобразование, использовать его метод GetBytes() для генерации массива. Но это, как правило, проблема, это где вы живете, мир не говорит ASCII, и вам, возможно, придется нарушить гарантию.

В целом, он плохо стандартизирован для метаданных изображения, спецификация редко выходит за рамки указания массива байтов и оставляет его неопределенным, как его следует интерпретировать. Практически вы можете выбрать между Encoding::Default и Encoding::UTF8, чтобы выполнить преобразование. Весьма вероятно, что Encoding::Default создаст читаемую строку на том же компьютере, на котором было сгенерировано изображение. Но если изображение будет путешествовать по планете, то utf8 будет лучшим выбором. YMMV. В Германии вы хотели бы проверить, появляются ли такие символы, как ß и Ü, как и ожидалось.

Другие вопросы по тегам