我正在使用此代码将文件保存到内存流
using System.Drawing.Imaging;
Dictionary<string,MemoryStream> dict = new Dictionary<string,MemoryStream>();
dict.Add("mypicture.png",new MemoryStream());
bmp.Save(dict["mypicture.png"], ImageFormat.Bmp);
之后我有一个接受这个文件名的函数
result = DrawMatches.Draw("box.png", "mypicture.png", out matchTime,i);
我是否正确地从内存流中访问该文件? 在函数中它说
无效参数
我认为我没有以正确的方式从内存流
访问该文件这是Drawmatches.Draw:
public static Image<Bgr, Byte> Draw(String modelImageFileName, String observedImageFileName, out long matchTime,int i)
{
Image<Gray, Byte> modelImage = new Image<Gray, byte>(modelImageFileName);
Image<Gray, Byte> observedImage = new Image<Gray, byte>(observedImageFileName);
}
错误不在编译中,而是在运行时
它说“参数无效”并指向观察图像
答案 0 :(得分:1)
我不确定Image<Gray, byte>
类是什么以及它是如何实现的,但是你将string
传递给它的构造函数 - 你确定这是正确的吗? (编辑:刚刚发现它是EMGU实施的一部分)。我将向您展示如何通常从流中创建图像:
MemoryStream ms = dict["mypicture.png"]; // This gives you the memory stream from the dictionary
ms.Seek(0, SeekOrigin.Begin); // Go to the beginning of the stream
Bitmap bmp = new Bitmap(ms); // Create image from the stream
现在我怀疑你想要使用以下构造函数从流中创建一个新的“emgu图像”:
Image<Bgr, Byte> img1 = new Image<Bgr, Byte>("MyImage.jpg");
根据EMGU文档,它应该从文件中读取图像。你没有名为“mypicture.png”的文件,你在词典“mypicture.png”下的字典中有一个流,这是完全不同的东西。我怀疑Image<t1, t2>
类是否能够从流中读取 - 至少我没有在文档中看到类似的内容。
您需要致电(使用我上面提供的代码):
Image<Gray, Byte> img1 = new Image<Gray, Byte>(bmp);
所有这一切,Draw
方法的代码(顺便说一下,它不能是静态的)应该是这样的:
private Bitmap GetBitmapFromStream(String bitmapKeyName)
{
MemoryStream ms = dict[bitmapKeyName];
ms.Seek(0, SeekOrigin.Begin);
return new Bitmap(ms);
}
public Image<Bgr, Byte> Draw(String modelImageFileName, String observedImageFileName, out long matchTime,int i)
{
Image<Gray, Byte> modelImage = new Image<Gray, byte>(GetBitmapFromStream(modelImageFileName));
Image<Gray, Byte> observedImage = new Image<Gray, byte>(GetBitmapFromStream(observedImageFileName));
}
修改强>
在下面的注释中,您说要通过将位图保存到内存流而不是写入磁盘来减少处理时间。
我需要问你以下问题:你为什么一开始就这样做?我从上面发布的代码中注意到,显然你已经将Bitmap
保存到内存流中。你为什么不把位图本身放入字典?
Dictionary<string, Bitmap> dict = new Dictionary<string, Bitmap>();
dict.Add("mypicture.png", bmp);
然后你可以立即检索它,浪费更少的时间来存储和从流中读取图像。然后Draw
方法会显示:
public Image<Bgr, Byte> Draw(String modelImageFileName, String observedImageFileName, out long matchTime,int i)
{
Image<Gray, Byte> modelImage = new Image<Gray, byte>(dict[modelImageFileName);
Image<Gray, Byte> observedImage = new Image<Gray, byte>(dict[observedImageFileName]);
}