c# - BitmapImage -> Bitmap -> Mat -> Bitmap ->BitmapImage 转换
问题描述
我正在开发一种实时视频聊天,并尝试使用 OpenCV 制作二进制图像。我正在研究 C# WPF,我必须在 Canvas 上绘制图像。这意味着我需要“BitmapImage”来绘制屏幕。但我必须使用“Mat”来制作二进制图像。所以我尝试了许多从 StackOverflow 中找到的解决方案,但从未对我有用。下面是我的代码。
Mat tempMat = new Mat();
Bitmap tempImage = BitmapImage2Bitmap(tempOriginal);
tempMat = BitmapConverter.ToMat(tempImage);
先转换BitmapImage
成Bitmap
,再转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;
我搜索了很多并尝试了几种解决方案来更改Bitmap
,BitmapImage
反之亦然。但从未奏效。下面的代码是我尝试过的解决方案。我是 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;
}
解决方案
我解决了。问题有两个。一个是 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;
}
}
推荐阅读
- javascript - 如果菜单长度超过Angular / Javascript中菜单类别的菜单视图长度,则菜单滚动ul li在页面滚动上左右
- python - 我怎样才能在列表中只获得一些价值?
- python - IndexError:列表索引超出范围有人可以帮助我吗?
- powerpoint - 无法为 JavaScript 运行 PowerPoint 形状 API
- node.js - 在 Google App Engine 中运行时,Nodejs 应用程序无法连接到 Firebase 实时数据库
- c++ - error : Function definition is not allowed here
- python - 如何使用 python 求解 csv 文件上的两个不同的依赖方程?
- database - Neo4j - 准备 CSV 数据
- linux - 在 ubuntu 上安装 libgconf-2-4
- matrix - 如何在 IlNumerics 数组中查找行