我需要在上传的图片中添加元数据标签(描述)。
我已经找到了这个答案:https://dev59.com/fXI-5IYBdhLWcg3woJ9J#1764913,它对于JPG文件非常有效,但对于PNG文件则无法正常工作。
根据可用格式的查询,第一种方法应该适用于两种格式。第二种方法实际上也不起作用(它会在图像中创建元数据,但不保存其值)。
如果我尝试在PNG中使用第一种方法(
我已经找到了这个答案:https://dev59.com/fXI-5IYBdhLWcg3woJ9J#1764913,它对于JPG文件非常有效,但对于PNG文件则无法正常工作。
private string Tag = "test meta data";
private static Stream TagImage(Stream input, string type)
{
bool isJpg = type.EndsWith("jpg", StringComparison.InvariantCultureIgnoreCase) || type.EndsWith("jpeg", StringComparison.InvariantCultureIgnoreCase);
bool isPng = type.EndsWith("png", StringComparison.InvariantCultureIgnoreCase);
BitmapDecoder decoder = null;
if (isJpg)
{
decoder = new JpegBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
}
else if (isPng)
{
decoder = new PngBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
}
else
{
return input;
}
// modify the metadata
BitmapFrame bitmapFrame = decoder.Frames[0];
BitmapMetadata metaData = (BitmapMetadata)bitmapFrame.Metadata.Clone();
metaData.Subject = Tag;
metaData.Comment = Tag;
metaData.Title = Tag;
// get an encoder to create a new jpg file with the new metadata.
BitmapEncoder encoder = null;
if (isJpg)
{
encoder = new JpegBitmapEncoder();
}
else if (isPng)
{
encoder = new PngBitmapEncoder();
}
encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metaData, bitmapFrame.ColorContexts));
// Save the new image
Stream output = new MemoryStream();
encoder.Save(output);
output.Seek(0, SeekOrigin.Begin);
return output;
}
当我上传jpg时,它运行良好,但是对于png,在metaData.Subject = Tag
行,它会抛出一个System.NotSupportedException
(此编解码器不支持指定的属性)。
更新
看来我必须根据图像格式使用不同的方法:
if (isJpg)
{
metaData.SetQuery("/app1/ifd/exif:{uint=270}", Tag);
}
else
{
metaData.SetQuery("/tEXt/{str=Description}", Tag);
}
根据可用格式的查询,第一种方法应该适用于两种格式。第二种方法实际上也不起作用(它会在图像中创建元数据,但不保存其值)。
如果我尝试在PNG中使用第一种方法(
/app1/ifd/exif
),在encoder.Save
行处会出现不支持的异常,“没有适合的成像组件”。