System.ArgumentException: Parameter is not valid

前端 未结 3 635
囚心锁ツ
囚心锁ツ 2020-12-20 14:43

I have a page that sends html5 canvas data, encoded as a base64 bmp image (using this algorithm http://devpro.it/code/216.html) to a serverside process that converts it into

相关标签:
3条回答
  • 2020-12-20 14:56

    This could happen if sf contained invalid image data. Verify the validity of the data you're passing into the stream, and see if that fixes your issue.

    0 讨论(0)
  • 2020-12-20 15:11

    I still don't know the real cause of your problem, but i guess it is related with a image format which Image class doesn't recognize. After inspecting the binary data a little bit, I could be able to form your image. I hope this helps.

    Bitmap GetBitmap(byte[] buf)
    {
        Int16 width = BitConverter.ToInt16(buf, 18);
        Int16 height = BitConverter.ToInt16(buf, 22);
    
        Bitmap bitmap = new Bitmap(width, height);
    
        int imageSize = width * height * 4;
        int headerSize = BitConverter.ToInt16(buf, 10);
    
        System.Diagnostics.Debug.Assert(imageSize == buf.Length - headerSize);
    
        int offset = headerSize;
        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                bitmap.SetPixel(x, height - y - 1, Color.FromArgb(buf[offset + 3], buf[offset], buf[offset + 1], buf[offset + 2]));
                offset += 4;
            }
        }
        return bitmap;
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        using (FileStream f = File.OpenRead("base64.txt"))
        {
            byte[] buf = Convert.FromBase64String(new StreamReader(f).ReadToEnd());
    
            Bitmap bmp = GetBitmap(buf);
            this.ClientSize = new Size(bmp.Width, bmp.Height);
            this.BackgroundImage = bmp;
        }
    }
    
    0 讨论(0)
  • 2020-12-20 15:20

    The posted code seems correct. I have tested it and it works fine.

    The exception "System.ArgumentException: Parameter is not valid." without any other hint (especially not the name of the parameter) is a wrapper for GDI+ (the underlying technology behind .NET Image class) standard InvalidParameter error, which does not tell use exactly what parameter is invalid.

    So, following the FromStream code with .NET Reflector, we can see that the parameters used in GDI+ calls are essentially ... the input stream.

    So my guess is the input stream you provide is sometimes invalid as an image? You should save the failing input streams (using File.SaveAllBytes(sf) for example) for further investigation.

    0 讨论(0)
提交回复
热议问题