首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitmapImage ->位图-> Mat ->位图->BitmapImage转换

BitmapImage ->位图-> Mat ->位图->BitmapImage转换
EN

Stack Overflow用户
提问于 2021-08-18 08:30:48
回答 1查看 117关注 0票数 1

我正在开发一种实时视频聊天,并尝试使用OpenCV制作二进制图像。我在C# WPF上工作,我必须在画布上绘制图像。这意味着我需要'BitmapImage‘来绘制屏幕。但是我必须使用'Mat‘来制作一个二进制图像。因此,我尝试了许多从StackOverflow找到的解决方案,但从未对我起作用。下面是我的代码。

代码语言:javascript
复制
   Mat tempMat = new Mat();
   Bitmap tempImage = BitmapImage2Bitmap(tempOriginal);
   tempMat = BitmapConverter.ToMat(tempImage);

首先将BitmapImage转换为Bitmap,然后将Bitmap转换为Mat。在此之后,将图像转换为二进制。下面是代码。

代码语言:javascript
复制
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();

完成此操作后,再次将垫子转换回BitmapBitmapImage。下面是代码。

代码语言:javascript
复制
tempImage = BitmapConverter.ToBitmap(tempMat);
BitmapImage resultBitmap = Bitmap2BitmapImage(tempImage);
ipWindow.ipView.ImageSource = resultBitmap;

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

Solution1。BitmapImage -> Bitmap

代码语言:javascript
复制
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);
            }
        }

Solution1。Bitmap -> BitmapImage

代码语言:javascript
复制
private BitmapImage Bitmap2BitmapImage(Bitmap bitmap){
            BitmapSource i = Imaging.CreateBitmapSourceFromHBitmap(
                           bitmap.GetHbitmap(),
                           IntPtr.Zero,
                           Int32Rect.Empty,
                           BitmapSizeOptions.FromEmptyOptions());
            return (BitmapImage)i;
}

Solution2。Bitmap -> BitmapImage

代码语言:javascript
复制
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;
}

Solution3。Bitmap -> BitmapImage

代码语言:javascript
复制
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;
}

Solution4。Bitmap -> BitmapImage

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2021-08-19 01:54:38

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

代码语言:javascript
复制
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;
            }
        }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68828989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档