System.ArgumentException: параметр недействителен - PullRequest
8 голосов
/ 23 сентября 2011

У меня есть страница, которая отправляет данные холста html5, закодированные как изображение base64 bmp (используя этот алгоритм http://devpro.it/code/216.html), в процесс на стороне сервера, который преобразует его в объект System.Drawing.Image и выполняет с ним некоторые операции .

В моем локальном окружении это работает просто отлично, но в моем экземпляре ec2 я получаю следующую ошибку:

System.ArgumentException: параметр недействителен. в System.Drawing.Image.FromStream (Потоковый поток, логическое значение useEmbeddedColorManagement, Boolean validateImageData) в System.Drawing.Image.FromStream (Потоковый поток, логическое значение useEmbeddedColorManagement)

Мой код выглядит следующим образом:

System.Drawing.Image image = null;
string b64string = "...";
byte[] sf = Convert.FromBase64String(b64string );
using (MemoryStream s = new MemoryStream(sf, 0, sf.Length))
{
   image = System.Drawing.Image.FromStream(s, false);
}
...

Вот текстовый файл с образцом строки b64, который я использую для проверки: https://docs.google.com/leaf?id=0BzVLGmig1YZ3MTM0ODBiNjItNzk4Yi00MzI5LWI5ZWMtMzU1OThlNWEyMTU5&hl=en_US

Я также попробовал следующее и получил те же результаты:

System.Drawing.ImageConverter converter = new System.Drawing.ImageConverter();
image = converter.ConvertFrom(sf) as System.Drawing.Image;         

Любое понимание будет с благодарностью!

Ответы [ 3 ]

5 голосов
/ 19 октября 2011

Я до сих пор не знаю истинную причину вашей проблемы, но я думаю, это связано с форматом изображения, который Image класс не распознает. После небольшой проверки двоичных данных я смог сформировать ваше изображение. Надеюсь, это поможет.

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;
    }
}
3 голосов
/ 19 октября 2011

Отправленный код кажется правильным.Я проверил его, и он отлично работает.

Исключение "System.ArgumentException: параметр недействителен."без какой-либо другой подсказки (особенно без имени параметра) есть обертка для GDI + (лежащая в основе технологии класса .NET Image) стандартная ошибка InvalidParameter , которая не указывает использовать точно, какой параметр недопустим.

Итак, следуя коду FromStream с .NET Reflector, мы видим, что параметры, используемые в вызовах GDI +, по сути ... являются входным потоком.

Так что я предполагаю, что это входной потокВы предоставляете иногда недействительным в качестве изображения?Вы должны сохранить ошибочные входные потоки (например, используя File.SaveAllBytes (sf)) для дальнейшего изучения.

0 голосов
/ 25 октября 2011

Это может произойти, если sf содержит недопустимые данные изображения.Проверьте достоверность данных, которые вы передаете в поток, и посмотрите, решит ли это вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...