我需要爲上傳的圖像添加元數據標籤(說明)。將元數據寫入JPG和PNE
我已經發現這個答案:https://stackoverflow.com/a/1764913/6776它適用於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);
}
基於the available formats' queries首先應該對兩種格式的工作。第二個也沒有效果(它在圖像中創建元數據但不保存其值)。
如果我嘗試使用PNG的第一種方法(/app1/ifd/exif
),在encoder.Save
這一行,我得到一個不支持的異常「沒有適合的成像組件」。
不是你的問題相關,但我認爲你的isJpg =語句有錯誤。我假設你想測試「.jpg」或「.jpeg」,但是你測試兩次「.jpg」。 – RenniePet 2015-03-16 11:28:02
是的,從那時起它已經在代碼中修復了,但不是在問題中。謝謝! – thomasb 2015-03-16 11:43:46