0

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

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

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

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

4

1 回答 1

1

我不太确定Image<Gray, byte>该类是什么以及它是如何实现的,但是您将 a 传递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]);
}
于 2013-02-06T12:49:01.460 回答