将类型“System.Drawing.Image”转换为“System.Windows.Media.ImageSource”

问题描述 投票:0回答:0

我需要一些关于如何将

'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);
                        }
                    };

我希望有人能帮助解决这个难题。

谢谢!

c# wpf image memorystream
© www.soinside.com 2019 - 2024. All rights reserved.