设置 a System::Drawing::Imaging::PropertyItem^ 的值

Setting the value of a 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" cannot be called with the given argument list." Argument types are(System::String^) Object type is System::Drawing::Imaging::PropertyItem^

Hans Passant 的回答是正确的。我已经按照以下方式实现了它:

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]);

值 属性 类型是 array<Byte>^。那可以是任何你想要的。但是需要进行转换,对于字符串,您必须为使用的编码而烦恼。

MSDN文档和PropertyTagTypeASCII毫不掩饰,你应该使用Encoding::ASCII进行转换,使用它的GetBytes()方法生成数组。但这往往是一个问题,这是你住的地方,世界不讲 ASCII,你可能不得不违反保修。

一般来说,图像元数据的标准化程度很低,规范很少超出指定字节数组的范围,并且未指定应如何解释它。实际上,您可以在 Encoding::Default 和 Encoding::UTF8 之间进行选择以进行转换。 Encoding::Default 很可能在生成图像的同一台机器上生成可读字符串。但如果图像要在地球上传播,那么 utf8 往往是更好的选择。 YMMV。在德国,您需要检查像 ß 和 Ü 这样的字形是否按预期显示。