Ho bisogno di aggiungere un tag metadata (descrizione) alle immagini caricate.Scrivi metadati sia in jpg che in png
Ho trovato questa risposta: https://stackoverflow.com/a/1764913/6776 che funziona perfettamente per i file JPG, ma non per 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;
}
Funziona benissimo quando si invia una jpg, ma con un png, alla linea metaData.Subject = Tag
, getta un System.NotSupportedException
(questo codec non supporta la proprietà specificata).
Aggiornamento
Sembra che devo usare un metodo diverso in base al formato di immagine:
if (isJpg)
{
metaData.SetQuery("/app1/ifd/exif:{uint=270}", Tag);
}
else
{
metaData.SetQuery("/tEXt/{str=Description}", Tag);
}
Sulla base the available formats' queries il primo dovrebbe funzionare per entrambi i formati. Anche il secondo non funziona (crea i metadati nell'immagine ma non ne salva il valore).
Se si tenta di utilizzare il primo metodo (/app1/ifd/exif
) per PNG, sulla riga encoder.Save
viene visualizzata un'eccezione non supportata, "nessun componente di imaging adatto".
Non rilevante alla tua domanda, ma Penso che ci sia un errore nella tua dichiarazione isJpg =. Presumo che tu voglia testare per ".jpg" o ".jpeg", ma testerai per ".jpg" due volte. – RenniePet
Sì, è stato risolto nel codice da allora, ma non nella domanda. Grazie! – thomasb