web-dev-qa-db-ja.com

System.Drawing.Imageを読み込む「パラメーターが無効です」例外

コードで「パラメーターが無効です」という例外が表示されるのはなぜですか。

MemoryStream ms = new MemoryStream(byteArrayIn);
System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);

byteArrayInの長さは169014です。値が255を超えていないにもかかわらず、この例外が発生しています。

30
manoj

私は同じ問題を抱えていて、現在は解決されているようですが、これと他のいくつかのgdi +例外は非常に誤解を招きますが、実際には問題はビットマップコンストラクタに送信されたパラメータが無効であることがわかりました。私はこのコードを持っています:

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

次の行はエラーの原因でした:

Bitmap bitmap = (Bitmap)Image.FromStream(fs, true, false)

ファイルストリームは、Map Serverからダウンロードしたファイルから作成されました。私のアプリは画像を取得するためにリクエストを誤って送信し、サーバーは拡張子がjpgの何かを返していましたが、実際にはエラーが発生したことを通知するhtmlでした。だから私はそのイメージを取り、それでビットマップを構築しようとしていました。修正は、有効なjpegイメージのイメージを制御/検証することでした。

それが役に立てば幸い!

18
Sebastian

私の推測では、byteArrayInには有効な画像データが含まれていません。

ただし、詳細を教えてください:

  • どのコード行が例外をスローしていますか?
  • メッセージは何ですか?
  • どこからbyteArrayInを取得しましたか。有効な画像が含まれているはずです。
14
Jon Skeet
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);
4
Savas Adar

どの行が例外をスローしていますか? 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);
3
Marc Gravell

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

例2は機能しますが、validateImageDataを有効にするにはuseEmbeddedColorManagementがfalseでなければならないことに注意してください。

メモリストリームをファイルにダンプし、内容を検査することにより、デバッグが最も簡単になる場合があります。

1
Sam

このエラーは、バッファに挿入されるバイナリデータが原因で発生します。この問題を解決するには、コードに1つのステートメントを挿入する必要があります。

このステートメントは次のとおりです。

obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));

例:

FileStream obj_FileStream = new FileStream(str_ImagePath, FileMode.OpenOrCreate, FileAccess.Read);
Byte[] Img = new Byte[obj_FileStream.Length];
obj_FileStream.Read(Img, 0, Convert.ToInt32(obj_FileStream.Length));         
dt_NewsFeedByRow.Rows[0][6] = Img;
1
gandarmin