在我的WPF應用程式中,影像是用相機拍攝的,使用一個視圖,然后在它關閉時通過eventargs作為位圖傳遞給另一個視圖。然而,當我試圖處理這些影像時,我得到了AccessViolationException。當我在傳遞圖片之前處理圖片或使用從檔案加載的圖片時,這種情況不會發生。
從相機中獲取影像(PtCamera類是我對API中Camera類的封裝)
Bitmap GetRefImage(PtCamera cam)
{
Bitmap image = new Bitmap(2560, 1920, System.Drawing.Imaging.PixelFormat.Format24bppRgb) 。
if (cam.IsConnected)
{
cam.FetchImage(out image)。
}
else; }
{
ErrorOccurred?.Invoke(this, $"GetRefImage: {cam.Error}")。)
}
return 影像。
}
在這個背景關系中,我可以訪問位圖,并按我的意愿進行處理。
當視圖關閉時傳遞位圖:
void CloseZoomedView(bool isConf)。
{
if (cam is object & & cam.IsConnected)
cam.Close()。
ZoomClosingArgs eArg = new ZoomClosingArgs()
{
IsConfirmed = isConf,
RefImage = refImage。
};
ClosingZoom?.Invoke(this, eArg) 。
在訪問另一個視圖模型中的資料時,直接出現了例外:
void HandleZoomImageClosed(object sender, ZoomClosingArgs e)。
{
if (e is object & & e.IsConfirmed)
{
顏色 test = e.RefImage.GetPixel(0, 0)。
//...。
}
位圖是通過FetchImage()
public void FetchImage(out Bitmap image)
{
camera.Memory.GetActive(out int memID)。
camera.Memory.ToBitmap(memID, out image)。
如果我把FetchImage()中的代碼替換成一個新的Bitmap檔案
image = new Bitmap(@ "d: estimage.png" )
它在任何情況下都能順利作業。
API檔案中簡單地說明了以下內容:
可訪問
Camera.Memory.ToBitmap
語法
uEye.Memory.ToBitmap(int s32MemId, out System.Drawing.Bitmap bitmap)
描述
回傳一個包含影像的位圖。該方法使用已經分配的 該方法使用已經分配的影像記憶體,影像將以你在分配影像記憶體時指定的格式顯示。描述
回傳一個包含影像的位圖。
非常感謝您的提示。
uj5u.com熱心網友回復:
我過早地關閉了我的相機物件。在CloseZoomedView()中,cam.Close()方法釋放了所有被相機占用的記憶體區域。在關閉之前傳遞一個新的Bitmap,它就像一個魅力。
void CloseZoomedView(bool isConf)。
{
ZoomClosingArgs eArg = new ZoomClosingArgs()
{
IsConfirmed = isConf,
RefImage = new Bitmap(refImage)。
};
if (cam is object & & cam.IsConnected)
cam.Close()。
ClosingZoom?.Invoke(this, eArg) 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/307906.html
標籤:
