Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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/6/opengl/4.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# Image.FromStream引发ArgumentException:参数无效_C#_.net_Image_Stream - Fatal编程技术网

C# Image.FromStream引发ArgumentException:参数无效

C# Image.FromStream引发ArgumentException:参数无效,c#,.net,image,stream,C#,.net,Image,Stream,我试图通过HttpHandler将图像输出到输出流,但它一直抛出ArgumentException。我在谷歌上搜索了这个问题,尝试了很多方法,但仍然无法解决这个问题。不管怎样,代码如下: public void ProcessRequest(HttpContext context) { Int32 imageId = context.Request.QueryString["id"] != null ? Convert.ToInt32(c

我试图通过HttpHandler将图像输出到输出流,但它一直抛出ArgumentException。我在谷歌上搜索了这个问题,尝试了很多方法,但仍然无法解决这个问题。不管怎样,代码如下:

    public void ProcessRequest(HttpContext context)
    {
        Int32 imageId = context.Request.QueryString["id"] != null ? 
            Convert.ToInt32(context.Request.QueryString["id"]) : default(Int32);

        if (imageId != 0)
        {
            //context.Response.ContentType = "image/jpeg";
            Byte[] imageData = this._imageInfoManager.GetTradeMarkImage(imageId);

            using (MemoryStream ms = new MemoryStream(imageData, 0, imageData.Length))
            {
                using (Image image = Image.FromStream(ms, true, true)) //this line throws
                {
                    image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                }
            }
        }
        throw new ArgumentException("Image could not be found.");
    }
请注意,imageData字节数组不是空的,并且内存流已正确填充。有什么想法吗

更新: 这是
GetTradeMarkImage
的代码。。。请注意,图像以
image
格式存储在SQL Server数据库中

    public Byte[] GetTradeMarkImage(Int32 id)
    {
        object result = DB.ExecuteScalar(SqlConstants.SqlProcedures.Request_GetImageById, id);

        if (result != null)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, result);
                return ms.ToArray();
            }                
        }
        return null;
    }

好的,现在您已经发布了
GetTradeMarkImage
代码,这几乎肯定是问题所在:

using (MemoryStream ms = new MemoryStream())
{
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, result);
    return ms.ToArray();
}
为什么希望BinaryFormatter的值是有效的图像流?不清楚数据库中有什么(BLOB?),也不清楚这里的
result
的执行时间类型(您应该通过调试找到),但您不应该在这里使用
BinaryFormatter
。我怀疑您只是想从数据库中获取原始数据,然后将其放入字节数组中


如果幸运的话,您可以将
result
转换为
byte[]
作为开始。(我不知道
ExecuteScalar
对blob做了什么,这显然不是“正常的”
ExecuteScalar
方法)。否则,您可能需要使用另一种方法,打开一个
DataReader
并以这种方式获取值。

好的,现在您已经发布了
GetTradeMarkImage
代码,这几乎肯定是问题所在:

using (MemoryStream ms = new MemoryStream())
{
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, result);
    return ms.ToArray();
}
为什么希望BinaryFormatter的值是有效的图像流?不清楚数据库中有什么(BLOB?),也不清楚这里的
result
的执行时间类型(您应该通过调试找到),但您不应该在这里使用
BinaryFormatter
。我怀疑您只是想从数据库中获取原始数据,然后将其放入字节数组中


如果幸运的话,您可以将
result
转换为
byte[]
作为开始。(我不知道
ExecuteScalar
对blob做了什么,这显然不是“正常的”
ExecuteScalar
方法)。否则,您可能需要使用另一种方法,打开一个
DataReader
并以这种方式获取值。

字节数组可能不是空的,但这与正确的情况不同。
GetTradeMarkImage
的代码是什么样子的,图像数据是什么格式的?当流没有有效的图像格式时,也会出现此异常。@JonSkeet:我更新了问题并包含了从数据库获取图像的代码。字节数组可能不是空的,但这和它的正确性不一样。
GetTradeMarkImage
的代码是什么样子的,图像数据是什么格式的?当流没有有效的图像格式时,也会出现此异常。@JonSkeet:我更新了问题并包含了从数据库获取图像的代码。Hmmm。。。是的,实际上我只需要数据库中的原始数据,然后我想在屏幕上显示图像。数据存储为数据库中的
image
。转换字节[]不起作用。ExecuteScalar只是企业库中相应方法的包装器。但除此之外,你认为我应该将数据存储在其他字段类型中吗?@Kassem:我说过要通过调试找出
result
的执行时间类型。。。什么是执行时间类型?在数据库中使用
图像
类型是可以的,但是需要使用不同的代码来获取数据。如果不知道
result
的值的类型,很难说清楚是什么。
result
的执行时间类型是
byte[]
@Kassem:不,您不需要创建
MemoryStream
并调用
ToArray
。只需返回cast
byte[]
-就可以了。嗯。。。是的,实际上我只需要数据库中的原始数据,然后我想在屏幕上显示图像。数据存储为数据库中的
image
。转换字节[]不起作用。ExecuteScalar只是企业库中相应方法的包装器。但除此之外,你认为我应该将数据存储在其他字段类型中吗?@Kassem:我说过要通过调试找出
result
的执行时间类型。。。什么是执行时间类型?在数据库中使用
图像
类型是可以的,但是需要使用不同的代码来获取数据。如果不知道
result
的值的类型,很难说清楚是什么。
result
的执行时间类型是
byte[]
@Kassem:不,您不需要创建
MemoryStream
并调用
ToArray
。只需返回cast
byte[]
-就可以了。