我需要一些关于如何将
'System.Drawing.Image'
转换为'System.Windows.Media.ImageSource'
的帮助
在下面的代码中,
var responseImage = System.Drawing.Image.FromStream(responseStream);
是一个System.Drawing.Image
但是我试图显示图像的imageControl
变量是一个System.Windows.Controls.Image
如何以及在哪里转换图像,以便它可以成功显示在
imageControl.Source
Dispatcher.Invoke(() =>
{
imageControl.Source = responseImage;
});
这里是有问题的方法:
private void CaptureCameraCallback(int camInd, System.Windows.Controls.Image imageControl)
{
// Create a new WebSocket connection
using (var ws = new WebSocketSharp.WebSocket("ws://localhost:8000/ws"))
{
// Connect to the WebSocket server
ws.Connect();
// Create a new video capture object
using (var capture = new VideoCapture(camInd))
{
// Create a concurrent queue to store response images
var responseQueue = new ConcurrentQueue<System.Drawing.Image>();
// Set up the event handler to add response images to the queue
ws.OnMessage += (sender, e) =>
{
var responseBytes = e.RawData;
using (var responseStream = new MemoryStream(responseBytes))
{
var responseImage = System.Drawing.Image.FromStream(responseStream);
responseQueue.Enqueue(responseImage);
}
};
// Start a loop to capture frames and send them to the Flask API.
while (true)
{
// Create a new Mat object to store the frame
using (var frame = new Mat())
{
// Read the next frame from the camera.
capture.Read(frame);
// Check if the frame is not empty.
if (!frame.Empty())
{
// Encode the frame as a JPEG image
var buffer = new byte[frame.Width * frame.Height * frame.ElemSize()];
Cv2.ImEncode(".jpg", frame, out buffer);
// Send the image to the server
ws.Send(buffer);
if (responseQueue.TryDequeue(out var responseImage))
{
// Convert System.Drawing.Image to System.Windows.Media.ImageSource
//var bitmap = new Bitmap(responseImage);
// Load the image from the file in the same directory as the executable
//var uri = new Uri(System.IO.Path.GetFullPath("C:/Users/nico_/Downloads/cat.jpeg"));
//var bitmapSource = new BitmapImage(uri);
// Display the image on the UI thread
Dispatcher.Invoke(() =>
{
imageControl.Source = responseImage;
});
}
}
else
{
// If the frame is empty, log an error and continue to the next frame.
Debug.WriteLine("Unable to capture Frame");
continue;
}
}
}
}
}
}
这是我得到的错误:
Severity Code Description Project File Line Suppression State
Error CS0029 Cannot implicitly convert type 'System.Drawing.Image' to 'System.Windows.Media.ImageSource' Iris C:\Users\nico_\Desktop\Projects\Iris\Iris WPF\IrisTest\Iris\View\HomeView.xaml.cs 233 Active
我尝试过的:
if (responseQueue.TryDequeue(out var responseImage))
{
// Convert System.Drawing.Image to System.Windows.Media.ImageSource
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
var ms = new MemoryStream();
responseImage.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
// Display the image on the UI thread
Dispatcher.Invoke(() =>
{
imageControl.Source = bitmapImage;
});
}
但是没有任何反应。所以也许我在想应该在这里进行转换?
// Set up the event handler to add response images to the queue
ws.OnMessage += (sender, e) =>
{
var responseBytes = e.RawData;
using (var responseStream = new MemoryStream(responseBytes))
{
var responseImage = new System.Drawing.Bitmap(responseStream);
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
MemoryStream ms = new MemoryStream();
responseImage.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
ms.Seek(0, SeekOrigin.Begin);
bitmapImage.StreamSource = ms;
bitmapImage.EndInit();
var NresponseImage = new System.Windows.Controls.Image();
NresponseImage.Source = bitmapImage;
responseQueue.Enqueue(NresponseImage);
}
};
我希望有人能帮助解决这个难题。
谢谢!