Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法返回无效的参数异常_C#_.net_Image_Exception_Memorystream - Fatal编程技术网

C# 方法返回无效的参数异常

C# 方法返回无效的参数异常,c#,.net,image,exception,memorystream,C#,.net,Image,Exception,Memorystream,我正在从智能相机成像仪捕获图像,并通过套接字编程从相机接收字节数组(.NET应用程序是客户端,相机是服务器) 问题是我在运行时遇到System.InvalidArgument异常 private Image byteArrayToImage(byte[] byteArray) { if(byteArray != null) { MemoryStream ms = new MemoryStream(byteArray); return Image

我正在从智能相机成像仪捕获图像,并通过套接字编程从相机接收字节数组(.NET应用程序是客户端,相机是服务器)

问题是我在运行时遇到System.InvalidArgument异常

private Image byteArrayToImage(byte[] byteArray) 
{
    if(byteArray != null) 
    {
        MemoryStream ms = new MemoryStream(byteArray);
        return Image.FromStream(ms, false, false); 
        /*last argument is supposed to turn Image data validation off*/
    }
    return null;
}
我在许多论坛上搜索过这个问题,并尝试了许多专家给出的建议,但没有任何帮助

我认为字节数组本身没有任何问题,因为当我将相同的字节数组输入到我的VC++MFC客户端应用程序时,我得到了图像。但这在C#NET中并不起作用

有人能帮我吗

附言:

我试图完成相同任务的其他方法有:

一,

二,


上述方法都不起作用。请提供帮助。

系统。InvalidArgument
表示流没有有效的图像格式,即不支持的图像类型

我过去也遇到过同样的问题,它是由windows GDI库中的泄漏引起的,这就是“位图”的用途。但是,如果这种情况一直发生在您身上,那么它可能与此无关。

我猜从服务器接收文件时出现了问题。可能您只是在尝试将文件转换为
图像之前获取了文件的一部分
?你确定这是你给C++应用程序提供的完全相同的字节数组吗? 尝试将流保存到一个文件中,然后查看得到的结果。你可能会在那里发现一些线索

您还可以添加一个断点,并手动将字节数组中的一些字节与它们应该是的字节进行比较(如果您知道的话)



编辑:看起来接收数据没有什么问题。问题在于它是原始格式(不是
Image.FromStream
可以理解的格式)。这种方法在这里可能有用。或者,你可以从原始数据中手工创建空白位图,并且BLT。

< P>当这样做时,我遇到了这个问题:

MemoryStream stream = new MemoryStream();
screenshot.Save(stream, ImageFormat.Png);
byte[] bytes = new byte[stream.Length];
stream.Save(bytes, 0, steam.Length);
MemoryStream stream = new MemoryStream();
screenshot.Save(stream, ImageFormat.Png);
byte[] bytes = stream.ToArray();
最后两行是问题所在。我通过这样做修复了它:

MemoryStream stream = new MemoryStream();
screenshot.Save(stream, ImageFormat.Png);
byte[] bytes = new byte[stream.Length];
stream.Save(bytes, 0, steam.Length);
MemoryStream stream = new MemoryStream();
screenshot.Save(stream, ImageFormat.Png);
byte[] bytes = stream.ToArray();
然后这就奏效了:

MemoryStream stream = new MemoryStream(bytes);
var newImage = System.Drawing.Image.FromStream(stream);
stream.Dispose();

图像可能嵌入在OLE字段中,必须考虑88字节OLE头加有效载荷:

byteBlobData = (Byte[]) reader.GetValue(0);
stream = new MemoryStream(byteBlobData, 88, byteBlobData.Length - 88);
img = Image.FromStream(stream);
Image.FromStream()
需要一个只包含一个图像的流

它将流位置重置为0。如果您有一个包含多个图像或其他内容的流,您必须将图像数据读取到字节数组中,然后使用以下命令初始化内存流

Image.FromStream(new MemoryStream(myImageByteArray));
只要图像还在使用,内存流必须保持打开状态


我也明白了这一点。

这段代码正在运行

        string query="SELECT * from gym_member where Registration_No ='" + textBox9.Text + "'";

        command = new SqlCommand(query,con);
        ad = new SqlDataAdapter(command);
        DataTable dt = new DataTable();
        ad.Fill(dt);
        textBox1.Text = dt.Rows[0][1].ToString();
        textBox2.Text = dt.Rows[0][2].ToString();
        byte[] img = (byte[])dt.Rows[0][18];
        MemoryStream ms = new MemoryStream(img);

        pictureBox1.Image = Image.FromStream(ms);
        ms.Dispose();
试试这个:

public Image byteArrayToImage(byte[] item)
{          
   Image img=Image.FromStream(new MemoryStream(item)); 
   img.Save(Response.OutputStream, ImageFormat.Gif);
   return img;
}

希望有帮助

尝试使用类似于此处描述的内容

来自rawbgraarray的图像(
字节[]arr,
int charWidth,int charHeight,
整数英寸,
像素格式(像素格式)
{
var输出=新位图(宽度、高度、像素格式);
var rect=新矩形(0,0,宽度,高度);
var bmpData=output.LockBits(rect,ImageLockMode.ReadWrite,output.PixelFormat);
//逐行复制
var arrRowLength=width*Image.GetPixelFormatSize(output.PixelFormat)/8;
var ptr=bmpData.Scan0;
对于(变量i=0;i
从数据库加载后,byteArray有多个字节的图像。在我的例子中是82

MemoryStream ms = new MemoryStream();
ms.Write(byteArray, 82, byteArray.Length - 82);
Image image = Image.FromStream(ms);
为了保存在数据库中,我插入82字节开始流
Properties.Resources.ImgForDB
——它是包含这82个字节的二进制文件。(我在下一个路径中得到它-将图像从DB加载到MemoryStream,并将前82个字节保存到二进制文件中。您可以在这里获取它-)


你好,谢谢你的回复。但是为什么在我的VC++MFC应用程序中使用相同的字节数组呢?还有什么方法可以检查字节数组图像数据的有效性吗?Arvind KHello Chris,谢谢你的回复。我每次运行代码时都会遇到这种情况。您好,我尝试将图像保存到jpg、bmp文件中,但文件中没有图片。令人费解的是,我能够在VC++MFC应用程序中显示图像的是同一个字节数组。这就是为什么我不能确定它是同一个字节数组。文件大小相同吗?VC++应用程序显示摄像机的实时图像,因此我所做的是将字节数组写入txt文件。类似地,我在.NET应用程序中将字节数组写入一个文件,然后比较这两个文件。我发现所有的值都被填充了,它们或多或少都是相同的。事实上,我尝试将从VC++应用程序(txt文件)获得的数组输入到我的C#.NET应用程序。这也失败了:-(由于落在相机镜头上的光线的强度波动,字节数组不会每次都是相同的。所以,我观察到的是VC++log和C#log之间字节数组值的一些微小变化。如果你只是将字节数组写入磁盘上的文件,会发生什么?该文件可以用photoshop之类的东西打开吗?你解决了吗?我已经解决了e同样的问题哪一行引发异常?在我的例子中,我只需要“删除”8个字节。新的内存流(byteBlobData,8,byteBlobData.Length-8);你怎么知道它是8位长的?我认为这对这种情况没有帮助。我有同样的问题。它帮助了我。
MemoryStream ms = new MemoryStream();
ms.Write(byteArray, 82, byteArray.Length - 82);
Image image = Image.FromStream(ms);
        MemoryStream temp = new MemoryStream();
        MemoryStream ms = new MemoryStream();
        OleDbCommand cmd;
        if (path != "")
        {
            Image.FromFile(path).Save(temp, System.Drawing.Imaging.ImageFormat.Bmp);
            ms.Write(Properties.Resources.ImgForDB, 0, Properties.Resources.ImgForDB.Length);
            ms.Write(temp.ToArray(), 0, temp.ToArray().Length);

        cmd = new OleDbCommand("insert into Someone (first, Second, Third) values (@a,@b,@c)", connP);
        cmd.Parameters.AddWithValue("@a", fio);
        cmd.Parameters.AddWithValue("@b", post);
        cmd.Parameters.AddWithValue("@c", ms.ToArray());
        cmd.ExecuteNonQuery();