«Параметр не действителен» исключение при загрузке System.Drawing.Image - PullRequest
30 голосов
/ 10 марта 2009

Почему я получаю исключение "Параметр недействителен" в моем коде:

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

Длина byteArrayIn равна 169014. Я получаю это исключение, несмотря на тот факт, что никакое значение в нем не превышает 255.

Ответы [ 9 ]

18 голосов
/ 20 августа 2009

У меня была такая же проблема, и, по-видимому, она теперь решена, несмотря на то, что это и некоторые другие исключения 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);
    }
}

Следующая строка вызывала ошибку:

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

Файловый поток был создан из файла, загруженного с картографического сервера. Мое приложение неправильно отправляло запрос на получение изображения, и сервер возвращал что-то с расширением jpg, но на самом деле это был HTML, сообщающий мне, что произошла ошибка. Поэтому я взял это изображение и попытался создать растровое изображение с ним. Исправление состояло в том, чтобы контролировать / проверять изображение на допустимое изображение JPEG.

Надеюсь, это поможет!

14 голосов
/ 10 марта 2009

Я предполагаю, что byteArrayIn не содержит действительных данных изображения.

Пожалуйста, дайте больше информации:

  • Какая строка кода вызывает исключение?
  • Что за сообщение?
  • Откуда вы взяли byteArrayIn, и вы уверены, что он должен содержать действительное изображение?
4 голосов
/ 15 января 2014
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);
3 голосов
/ 10 марта 2009

Какая строка выдает исключение? 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);
1 голос
/ 05 августа 2011

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

Это утверждение:

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 голос
/ 10 апреля 2011

Исключение «параметр не действителен», выданное 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 будет работать, обратите внимание, что useEmbeddedColorManagement должно иметь значение false, чтобы validateImageData был действительным.

Может быть проще всего отладить, выгрузив поток памяти в файл и проверив содержимое.

0 голосов
/ 26 июня 2017

Просто следуйте этому, чтобы вставить значения в базу данных

// Строка соединения

  con.Open();

sqlQuery = "INSERT INTO [dbo].[Client] ([Client_ID],[Client_Name],[Phone],[Address],[Image]) VALUES('" + txtClientID.Text + "','" + txtClientName.Text + "','" + txtPhoneno.Text + "','" + txtaddress.Text + "',@image)";

                cmd = new SqlCommand(sqlQuery, con);
                cmd.Parameters.Add("@image", SqlDbType.Image);
                cmd.Parameters["@image"].Value = img;
            //img is a byte object
           ** /*MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms,pictureBox1.Image.RawFormat);
            byte[] img = ms.ToArray();*/**

                cmd.ExecuteNonQuery();
                con.Close();
0 голосов
/ 07 февраля 2013

В большинстве случаев это неверные данные в столбце SQL. Это правильный способ вставить в столбец изображения:

INSERT INTO [TableX] (ImgColumn) VALUES (
(SELECT * FROM OPENROWSET(BULK N'C:\....\Picture 010.png', SINGLE_BLOB) as tempimg))

Большинство людей делают это неправильно таким образом:

INSERT INTO [TableX] (ImgColumn) VALUES ('C:\....\Picture 010.png'))
0 голосов
/ 08 мая 2012

все приведенные решения не работают .. не концентрируйтесь только на поисковой части. Лук при вставке изображения. Я сделал ту же ошибку. Я взял образ с жесткого диска и сохранил его в базе данных. Проблема заключается в команде вставки. Люк по моей вине код ..:

 public bool convertImage()
    {
        try
        {
            MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
            photo = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(photo, 0, photo.Length);
            return true;
        }
        catch
        {
            MessageBox.Show("image can not be converted");
            return false;
        }
    }
    public void insertImage()
    {
       // SqlConnection con = new SqlConnection();
        try
        {
            cs.Close();
            cs.Open();
            da.UpdateCommand = new SqlCommand("UPDATE All_students SET disco = " +photo+" WHERE Reg_no = '" + Convert.ToString(textBox1.Text)+ "'", cs);
            da.UpdateCommand.ExecuteNonQuery();
            cs.Close();
            cs.Open();
            int i = da.UpdateCommand.ExecuteNonQuery();
            if (i > 0)
            {
                MessageBox.Show("Successfully Inserted...");
            }

        }
        catch
        {
            MessageBox.Show("Error in Connection");
        }
        cs.Close();
    }

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

  public bool convertImage()
    {
        try
        {
            MemoryStream ms = new MemoryStream();
            pictureBox1.Image.Save(ms, ImageFormat.Jpeg);
            photo = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(photo, 0, photo.Length);
            return true;
        }
        catch
        {
            MessageBox.Show("image can not be converted");
            return false;
        }
    }
    public void insertImage()
    {
       // SqlConnection con = new SqlConnection();
        try
        {
            cs.Close();
            cs.Open();
            //THIS WHERE THE CODE MUST BE CHANGED>>>>>>>>>>>>>>

            da.UpdateCommand = new SqlCommand("UPDATE All_students SET disco = @img WHERE Reg_no = '" + Convert.ToString(textBox1.Text)+ "'", cs);
            da.UpdateCommand.Parameters.Add("@img", SqlDbType.Image);//CHANGED TO IMAGE DATATYPE...
            da.UpdateCommand.Parameters["@img"].Value = photo;
            da.UpdateCommand.ExecuteNonQuery();
            cs.Close();
            cs.Open();
            int i = da.UpdateCommand.ExecuteNonQuery();
            if (i > 0)
            {
                MessageBox.Show("Successfully Inserted...");
            }

        }
        catch
        {
            MessageBox.Show("Error in Connection");
        }
        cs.Close();
    }

100% гарантия того, что ПАРАМЕТР НЕ ДОПУСКАЕТ ошибку при извлечении .... РЕШЕНО !!!!!!!!

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