En base a otras respuestas, escribí la siguiente clase que permite varias manipulaciones de metadatos. Lo usa así:
var jpeg = new JpegMetadataAdapter(pathToJpeg);
jpeg.Metadata.Comment = "Some comments";
jpeg.Metadata.Title = "A title";
jpeg.Save(); // Saves the jpeg in-place
jpeg.SaveAs(someNewPath); // Saves with a new path
Las diferencias entre mi solución y las demás no son grandes. Principalmente he refactorizado esto para ser más limpio. También uso las propiedades de nivel superior de BitmapMetadata
, en lugar del método SetQuery
.
Aquí está el código completo, que se licencia bajo the MIT licence. Deberá agregar referencias a PresentationCore
, WindowsBase
y System.Xaml
.
public class JpegMetadataAdapter
{
private readonly string path;
private BitmapFrame frame;
public readonly BitmapMetadata Metadata;
public JpegMetadataAdapter(string path)
{
this.path = path;
frame = getBitmapFrame(path);
Metadata = (BitmapMetadata)frame.Metadata.Clone();
}
public void Save()
{
SaveAs(path);
}
public void SaveAs(string path)
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(frame, frame.Thumbnail, Metadata, frame.ColorContexts));
using (Stream stream = File.Open(path, FileMode.Create, FileAccess.ReadWrite))
{
encoder.Save(stream);
}
}
private BitmapFrame getBitmapFrame(string path)
{
BitmapDecoder decoder = null;
using (Stream stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
}
return decoder.Frames[0];
}
}
Debe votar y/o aceptar sus respuestas si las encontró útiles. ¡Aclamaciones! – RickL
Vaya, cometí un pequeño error con mi solución anterior. Debería haber dicho que necesita agregar la referencia de PresentationCore, no el System.Core Ps. Gracias por el cara a cara Rick! Lo haré enseguida. –
Dado que jpeg es un formato con pérdida, ¿esperaría perder calidad al agregar metadatos con este método, o solo modifica los metadatos sin afectar la imagen? –