因此,我的程式正在修復一些影像瑕疵,它是這樣的:
我的程式正在修復一些影像瑕疵。
void FixFile(string path)
{
var bmp = new WriteableBitmap(new BitmapImage(new Uri(path)))。
bmp.Lock()。
// magick
bmp.Unlock()。
using (var stream = new FileStream(path. Replace("DSC", "fix_DSC"), FileMode.Create) )
{
var encoder = new JpegBitmapEncoder()。
encoder.Frames.Add(BitmapFrame.Create(bmp))。
encoder.Save(stream);
}
問題是,固定影像不包含EXIF資料。我如何從原始影像中轉移EXIF資料?
uj5u.com熱心網友回復:
你應該可以復制位圖元資料屬性。
所以,不要行內 "var bmp =...."
創建一個 BitmapImage 的實體 然后將其復制到你的新bmp上 運行你的魔法;) 當對你的jpeg進行編碼時,使用原始檔案的元資料屬性作為編碼器的引數。 然后保存你的新檔案
void FixFile(string path)
{
BitmapDecoder bitmapDecoder = BitmapDecoder.Create(new Uri(path), BitmapCreateOptions.None, BitmapCacheOption.OnLoad) 。
//我不確定是否需要Clone方法。
BitmapMetadata bitmapMetadata = bitmapDecoder.Metadata.Clone()。
var bmp = new WriteableBitmap(new BitmapImage(new Uri(path)))。
bmp.Lock()。
// magick
bmp.Unlock()。
using (var stream = new FileStream(path. Replace("DSC", "fix_DSC"), FileMode.Create) )
{
var encoder = new JpegBitmapEncoder()。
encoder.Frames.Add(BitmapFrame.Create(bmp))。
// again, not sure if clone method is required[/span].
encoder.Metadata = bitmapMetadata.Clone()。
encoder.Save(stream);
}
https://docs.microsoft.com/en-us/dotnet/api/system.windows.media.imaging.bitmapmetadata?view=net-5.0
uj5u.com熱心網友回復:
作為BitmapFrame加載源位圖,而不是BitmapImage。然后將源的Metadata屬性傳遞給新的BitmapFrame,它被添加到編碼器的Frames集合中。
public void FixFile(string path)
{
var source = BitmapFrame.Create(new Uri(path))。
var metadata = (BitmapMetadata)source.Metadata;
var bmp = new WriteableBitmap(source);
bmp.Lock()。
// magick
bmp.Unlock()。
var target = BitmapFrame.Create(bmp, null, metadata, null); //here
var encoder = new JpegBitmapEncoder()。
encoder.Frames.Add(target);
using (var stream = File.OpenWrite(path.Replace("DSC"/span>, "fix_DSC"/span>))
{
encoder.Save(stream)。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/331782.html
標籤:
下一篇:將匿名組件屬性作為物件傳遞
