C# Image.FromStream引发ArgumentException:参数无效
我试图通过HttpHandler将图像输出到输出流,但它一直抛出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
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
。只需返回castbyte[]
-就可以了。嗯。。。是的,实际上我只需要数据库中的原始数据,然后我想在屏幕上显示图像。数据存储为数据库中的image
。转换字节[]不起作用。ExecuteScalar只是企业库中相应方法的包装器。但除此之外,你认为我应该将数据存储在其他字段类型中吗?@Kassem:我说过要通过调试找出result
的执行时间类型。。。什么是执行时间类型?在数据库中使用图像
类型是可以的,但是需要使用不同的代码来获取数据。如果不知道result
的值的类型,很难说清楚是什么。result
的执行时间类型是byte[]
@Kassem:不,您不需要创建MemoryStream
并调用ToArray
。只需返回castbyte[]
-就可以了。