Подтвердить что ты не робот

Исправлена ​​ошибка "Параметр недействителен" System.Drawing.Image

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

  • Какая строка кода генерирует исключение?
  • Что сообщение?
  • Откуда вы получили byteArrayIn, и уверены ли вы, что он должен содержать допустимое изображение?

Ответ 3

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

Какая строка выбрасывает исключение? 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);

Ответ 5

"Параметр недействителен", исключение, созданное 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, чтобы быть действительным.

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

Ответ 6

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

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

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;

Ответ 7

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

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

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

  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% гарантия, что не будет ПАРАМЕТРА НЕ ВАЛИДНАЯ ошибка в извлечения.... РЕШАЕМ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ответ 8

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

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

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

Ответ 9

В большинстве случаев, когда это происходит, это плохие данные в столбце 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'))