内存流中的访问文件? C#

时间:2013-02-06 12:31:28

标签: c# memorystream

我正在使用此代码将文件保存到内存流

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

错误不在编译中,而是在运行时

它说“参数无效”并指向观察图像

1 个答案:

答案 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]);
}