我正在構建一個WPF桌面應用程序,以幫助我組織照片發佈到Facebook。下面是我用的標題(EXIF + IPTC + XMP)創建一個新位置的照片副本程式碼:JpegBitmapEncoder.Save()在使用元數據編寫圖像時引發異常
private void SaveImageAs(string currPath, string newPath, bool setCaption = false, string captionToSet = "")
{
System.IO.FileStream stream = new System.IO.FileStream(currPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
JpegBitmapDecoder decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapFrame bitmapFrame = decoder.Frames[0];
BitmapMetadata metadata = bitmapFrame.Metadata.Clone() as BitmapMetadata;
stream.Close();
if (setCaption)
{
// if we want to set the caption, do it in EXIF, IPTC, and XMP
metadata.SetQuery("/app1/ifd/{uint=270}", captionToSet);
metadata.SetQuery("/app13/irb/8bimiptc/iptc/Caption", captionToSet);
metadata.SetQuery("/xmp/dc:description/x-default", captionToSet);
}
MemoryStream memstream = new MemoryStream(); // create temp storage in memory
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metadata, bitmapFrame.ColorContexts));
encoder.Save(memstream); // save in memory
stream.Close();
stream = new FileStream(newPath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite);
memstream.Seek(0, System.IO.SeekOrigin.Begin); // go to stream start
byte[] bytes = new byte[memstream.Length + 1];
memstream.Read(bytes, 0, (int)memstream.Length);
stream.Write(bytes, 0, bytes.Length);
stream.Close();
memstream.Close();
}
運行的是,我得到一個「收到COMException是未處理」異常突出顯示該行:
encoder.Save(memstream);
'System.Runtime.InteropServices.COMException' 類型的未處理的異常出現在 PresentationCore.dll中
其他信息:句柄無效。 (異常來自HRESULT:0x80070006(E_HANDLE))
我看到here,這可能是由於線程問題,所以不是從應用程序直接調用SaveImageAs,我加了這一點,沒有任何影響:
private void _SaveImageAs(string currPath, string newPath, bool setCaption = false, string captionToSet = "")
{
Thread saveThread = new Thread(() => SaveImageAs(currPath, newPath, setCaption, captionToSet));
saveThread.SetApartmentState(ApartmentState.STA);
saveThread.IsBackground = false;
saveThread.Start();
}
我也試過換出的MemoryStream爲一個FileStream創建本地臨時file--並沒有改變任何東西:
FileStream memstream = new FileStream(System.IO.Path.GetDirectoryName(newPath) + @"\" + "temp.jpg", System.IO.FileMode.OpenOrCreate);
任何想法?
太好了,謝謝! – amb9800