Yüklenen görüntülere bir meta veri etiketi (açıklama) eklemem gerekiyor.Hem jpg hem de png için meta verileri yaz
Bu yanıtı şu buldu: JPG dosyaları için harika, ancak PNG için uygun olmayan https://stackoverflow.com/a/1764913/6776.
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;
}
Bir jpg yüklediğinizde O inşaat büyük, ancak bir png ile metaData.Subject = Tag
çizgisinde, bir System.NotSupportedException
atar (bu codec'i belirtilen özelliği desteklemez).
Güncelleme Ben görüntü formatına dayalı farklı bir yöntem kullanmak zorunda görünüyor
:
if (isJpg)
{
metaData.SetQuery("/app1/ifd/exif:{uint=270}", Tag);
}
else
{
metaData.SetQuery("/tEXt/{str=Description}", Tag);
}
the available formats' queries dayanarak ilk iki biçim için çalışmalıdır. İkincisi de gerçekten işe yaramıyor (görüntüdeki meta verileri yaratıyor ama değerini kaydetmiyor).
PNG için ilk yöntemi (/app1/ifd/exif
) kullanmaya çalışırsam, encoder.Save
satırında "destekleyici bileşen uygun değil" destekli bir istisna kabul ediyorum.
alakalı değil, ama Sanırım isJpg = ifadesinde bir hata var. ".jpg" veya ".jpeg" için test etmek istediğinizi varsayalım, ancak ".jpg" yi iki kez test ettiniz. – RenniePet
Evet, o zamandan beri kodda düzeltildi, ancak soruda değil. Teşekkürler! – thomasb