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

时间:2018-08-16 07:56:29

标签: c++-cli system.drawing.imaging

我想给我的Bitmap一个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 个答案:

答案 0 :(得分:4)

Value属性类型为array<Byte>^。那可以是您想要的任何东西。但是需要进行转换,对于字符串,您必须非常担心所使用的编码。

MSDN文档和PropertyTagTypeASCII对此一无所知,您应该使用Encoding::ASCII进行转换,并使用其GetBytes()方法生成数组。但这往往是一个问题,那就是您所居住的地方,世界上不会说ASCII,因此您可能不得不违反保修条款。

通常,它对图像元数据的标准化很差,规范很少超出指定字节数组的范围,而未指定应如何解释它。实际上,您可以在Encoding :: Default和Encoding :: UTF8之间进行选择。 Encoding :: Default很可能在生成图像的同一台机器上产生可读的字符串。但是,如果图像要绕行星传播,则utf8往往是更好的选择。 YMMV。在德国,您需要检查ß和Ü等字形是否按预期出现。