首页 > 解决方案 > BitmapImage -> Bitmap -> Mat -> Bitmap ->BitmapImage 转换

问题描述

我正在开发一种实时视频聊天,并尝试使用 OpenCV 制作二进制图像。我正在研究 C# WPF,我必须在 Canvas 上绘制图像。这意味着我需要“BitmapImage”来绘制屏幕。但我必须使用“Mat”来制作二进制图像。所以我尝试了许多从 StackOverflow 中找到的解决方案,但从未对我有用。下面是我的代码。

   Mat tempMat = new Mat();
   Bitmap tempImage = BitmapImage2Bitmap(tempOriginal);
   tempMat = BitmapConverter.ToMat(tempImage);

先转换BitmapImageBitmap,再转Bitmap换成Mat。之后,使图像二进制。下面是代码。

Mat hsv = new Mat();
Mat binary = new Mat();
Cv2.CvtColor(tempMat, hsv, ColorConversionCodes.BGR2HSV);
Cv2.InRange(hsv, new Scalar(minH, minS, minV), new Scalar(maxH, maxS, maxV), binary);
tempMat = binary.Clone();
binary.Release();
hsv.Release();

Bitmap完成此操作后,将垫子来回转换BitmapImage。下面是代码。

tempImage = BitmapConverter.ToBitmap(tempMat);
BitmapImage resultBitmap = Bitmap2BitmapImage(tempImage);
ipWindow.ipView.ImageSource = resultBitmap;

我搜索了很多并尝试了几种解决方案来更改BitmapBitmapImage反之亦然。但从未奏效。下面的代码是我尝试过的解决方案。我是 C# 和 WPF 的新手,所以我不知道如何解决这个问题。感谢您阅读这个长问题。

解决方案1。BitmapImage->Bitmap

private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage){
            
            using (MemoryStream outStream = new MemoryStream())
            {
                BitmapEncoder enc = new BmpBitmapEncoder();
                enc.Frames.Add(BitmapFrame.Create(bitmapImage));
                enc.Save(outStream);
                Bitmap bitmap = new Bitmap(outStream);
                outStream.Close();

                return new Bitmap(bitmap);
            }
        }

解决方案1。Bitmap->BitmapImage

private BitmapImage Bitmap2BitmapImage(Bitmap bitmap){
            BitmapSource i = Imaging.CreateBitmapSourceFromHBitmap(
                           bitmap.GetHbitmap(),
                           IntPtr.Zero,
                           Int32Rect.Empty,
                           BitmapSizeOptions.FromEmptyOptions());
            return (BitmapImage)i;
}

解决方案2。Bitmap->BitmapImage

private BitmapImage Bitmap2BitmapImage(Bitmap inputBitmap){
Bitmap bitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            MemoryStream ms = new MemoryStream();
            bitmap.Save(ms, ImageFormat.Bmp);
            var bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = ms;
            bi.CacheOption = BitmapCacheOption.OnLoad;
            bi.EndInit();
            return bi;
}

解决方案3。Bitmap->BitmapImage

private BitmapImage Bitmap2BitmapImage(Bitmap inputBitmap){
using (var memory = new MemoryStream())
            {
                inputBitmap.Save(memory, ImageFormat.Png);
                memory.Position = 0;

                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = memory;
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.EndInit();
                bitmapImage.Freeze();

                return bitmapImage;
}

解决方案4。Bitmap->BitmapImage

private BitmapImage Bitmap2BitmapImage(Bitmap inputBitmap){
MemoryStream ms = new MemoryStream();
            inputBitmap.Save(ms, ImageFormat.Bmp);
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            ms.Seek(0, SeekOrigin.Begin);
            image.StreamSource = ms;
            image.EndInit();
            return image;
}

标签: c#opencvbitmapimage

解决方案


我解决了。问题有两个。一个是 OpenCvSharp,另一个是 Bitmap to BitmapImage。实际上 OpenCvSharp 问题很严重,所以我在上面找不到合适的解决方案。但是在我卸载并重新安装 openCvSharp 之后,我发现了适合我的解决方案。代码如下。

private BitmapImage Bitmap2BitmapImage(Bitmap inputBitmap)
        {
            using (var memory = new MemoryStream())
            {
                inputBitmap.Save(memory, ImageFormat.Png);
                memory.Position = 0;

                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = memory;
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.EndInit();
                bitmapImage.Freeze();

                return bitmapImage;
            }
        }

推荐阅读