"参数无效"异常加载System.Drawing.Image

30 c# image stream argumentexception

为什么我的代码中出现"参数无效"异常:

MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
Run Code Online (Sandbox Code Playgroud)

长度byteArrayIn是169014.尽管事实上它没有大于255的值,但我得到了这个例外.

Seb*_*ian 18

我有同样的问题,显然现在解决了,尽管这和其他一些gdi +异常非常误导,我发现实际问题是发送到Bitmap构造函数的参数无效.我有这个代码:

using (System.IO.FileStream fs = new System.IO.FileStream(inputImage, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite))
{
    try
    {
        using (Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false))
        {
            try
            {
                bitmap.Save(OutputImage + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
                GC.Collect();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
    catch (ArgumentException aex)
    {
        throw new Exception("The file received from the Map Server is not a valid jpeg image", aex);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下行导致错误:

Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false)
Run Code Online (Sandbox Code Playgroud)

文件流是从从Map Server下载的文件构建的.我的应用程序错误地发送请求以获取图像,并且服务器返回了jpg扩展名的内容,但实际上是一个html告诉我发生了错误.所以我正在拍摄该图像并试图用它构建一个Bitmap.修复是控制/验证图像的有效jpeg图像.

希望能帮助到你!


Jon*_*eet 15

我的猜测是byteArrayIn不包含有效的图像数据.

请提供更多信息:

  • 哪一行代码抛出异常?
  • 消息是什么?
  • 你从哪里来byteArrayIn的,你确定它应该包含有效的图像吗?


小智 7

抛出的“参数无效”异常Image.FromStream()告诉您该流不是“有效”或“可识别”格式。观察内存流,特别是当您从文件中获取各种字节偏移量时。

// 1. Create a junk memory stream, pass it to Image.FromStream and 
// get the "parameter is not valid":
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);`

// 2. Create a junk memory stream, pass it to Image.FromStream
// without verification:
MemoryStream ms = new MemoryStream(new Byte[] {0x00, 0x01, 0x02});
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms, false, true);
Run Code Online (Sandbox Code Playgroud)

示例 2 将起作用,请注意 useEmbeddedColorManagement 必须为 false 才能使 validateImageData 有效。

通过将内存流转储到文件并检查内容可能是最简单的调试方法。


Sav*_*dar 7

byte[] fileData = null;
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream))
{
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
ImageConverter imageConverter = new System.Drawing.ImageConverter();
System.Drawing.Image image = imageConverter.ConvertFrom(fileData) as System.Drawing.Image;
image.Save(imageFullPath, System.Drawing.Imaging.ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 3

哪一行抛出异常?这new MemoryStream(...)?或者Image.FromStream(...)?什么是byteArrayIn?是一个吗byte[]?我只是因为评论“并且其中的任何值都不大于 255”而问 - 这当然对于byte[].

一个更明显的问题是:二进制文件实际上包含合理格式的图像吗?

例如,以下代码(虽然不是很好的代码)可以正常工作:

    byte[] data = File.ReadAllBytes(@"d:\extn.png"); // not a good idea...
    MemoryStream ms = new MemoryStream(data);
    Image img = Image.FromStream(ms);
    Console.WriteLine(img.Width);
    Console.WriteLine(img.Height);
Run Code Online (Sandbox Code Playgroud)