2016-05-11 5 views
0

В некоторых случаях я получаю эту ошибку. «Параметр недействителен. Трассировка стека в System.Drawing.Bitmap..ctor (поток потока)« Я немного запутался, как он работает для некоторых записей, почему не для других. Любой, пожалуйста, руководство меня, чтобы найти свою ошибку, будет очень полезно ..,Параметр недействителен. Трассировка стека в System.Drawing.Bitmap..ctor (поток потока)

Ниже приведены мои коды.,

private void RefreshImage() 
    { 
     if (this.dsPatPhoto.dmDoc.Count <= 0) return; 

     byte[] patImage = null; 
     byte[] driverLicImage = null; 

     foreach (CmData.WrCmDoc.DsCmDoc.dmDocRow row in this.dsPatPhoto.dmDoc) 
     { 
      if (!row.IsIDDocTypeNull() && 
       row.IDDocType == (short)AppCommonCfg.DocType.PatientDriverLicense) 
      { 
       if (!row.IsDocImageNull()) 
        driverLicImage = row.DocImage; 
      } 
      else 
      { 
       if (!row.IsDocImageNull()) 
        patImage = row.DocImage; 
      } 
     } 

     System.IO.MemoryStream stream; 
     if (patImage != null && patImage.Length > 0) 
     { 
      stream = new System.IO.MemoryStream(patImage, true); 
      this.ucPictureEditPic.Clear(); 
      this.ucPictureEditPic.Image = new System.Drawing.Bitmap(stream); 
     } 

     if (driverLicImage != null && driverLicImage.Length > 0) 
     { 
      stream = new System.IO.MemoryStream(driverLicImage, true); 
      this.ucPictureEditDL.Clear(); 
      this.ucPictureEditDL.Image = new System.Drawing.Bitmap(stream); //Error occurs here. 
     } 

    } 
+1

Является ли изображение, хранящееся в наборе данных, действительным изображением? Если конструктор не может понять, как структурированы данные байта, он не сможет построить изображение из байтов. Если вы загружаете байты из известного файла и сравниваете его с байтами из набора данных, они совпадают? См. Также [Источник ссылки растрового изображения] (http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Bitmap.cs,167). – theB

+0

@ theB-Спасибо за ответ. Но я не уверен, что мое изображение недействительно. Если это поврежденное изображение означает, что я могу сделать .., Есть ли способ преобразовать его в действительное изображение. По коду мы можем сделать это возможным? – shobia

+0

Из исходного источника выглядит, что битмап-класс использует GDI + для создания изображений. Существует 7 ошибок GDI, которые могут вызвать конструктор, чтобы вызвать параметр «ArgumentException» 1), 2) Неизвестный формат изображения, 3) Свойство не найдено, 4) Свойство не поддерживается, 5-7) Ассортимент шрифтов.Учитывая описание проблемы, я готов устранить все, кроме # 2. Если вы сохраните данные из набора данных в файл, вы можете открыть этот файл в редакторе изображений? (IE - используйте 'System.IO.File.WriteAllBytes()', чтобы выгрузить массив байтов в файл, когда вы получите исключение.) – theB

ответ

1

Используя Reference Source мы можем видеть, что класс растровый использует GDI + нативные методы построения образ. Из справочного источника мы также можем видеть list of exceptions, что конструктор может выбросить. Из всех исключений, которые можно бросить, есть 8 мест, где может возникнуть исключение ArgumentException.

  1. Поток имеет значение null.
  2. Недопустимый параметр.
  3. Неизвестный формат изображения.
  4. Недвижимость не найдена.
  5. Не поддерживается.
  6. Шрифтовая семья не найдена.
  7. Стиль шрифта не найден.
  8. Не верно Тип шрифта.

Мы можем устранить # 6-8 сразу же, так как вы не пытаетесь отобразить шрифт. Мы также можем исключить # 1, так как объект потока создается непосредственно над вызовом конструктора bitmap. Числа 2, 4 и 5 немного сложнее оценить, но я устранил их как возможности, поскольку потоки памяти действительны для построения растровых изображений. (Я часто использую его как метод для рендеринга веб-изображений).

Это оставляет нам неизвестный формат изображения. Существует два способа проверить, что массив байтов действителен.

  1. Загрузить копию изображения из файла и сравнить байты тех из DataSet.

    if (driverLicImage != null && driverLicImage.Length > 0) 
    { 
        byte[] knownGoodImage = System.IO.File.ReadAllBytes("Path to good file on disk"); 
        if (!driverLicImage.SequenceEqual(knownGoodImage)) 
        { 
         // now you know that the bytes in the database don't match 
        } 
        stream = new System.IO.MemoryStream(driverLicImage, true); 
        this.ucPictureEditDL.Clear(); 
        this.ucPictureEditDL.Image = new System.Drawing.Bitmap(stream); //Error occurs here. 
    } 
    
  2. Поймайте исключение конструктора и сохраните файл на диск, так что вы можете попробовать открыть его с помощью редактора изображений. (Как MS Paint)

    if (driverLicImage != null && driverLicImage.Length > 0) 
    { 
        try 
        { 
         stream = new System.IO.MemoryStream(driverLicImage, true); 
         this.ucPictureEditDL.Clear(); 
         this.ucPictureEditDL.Image = new System.Drawing.Bitmap(stream); //Error occurs here. 
        } 
        catch (ArgumentException ex) 
        { 
         System.Diagnostics.Debug.Print(ex.Message); 
         System.IO.File.WriteAllBytes("Filename", driverLicImage); 
        } 
    } 
    

    Конечно, вы захотите выбрать подходящее имя файла.

+0

@ theB-Thank u так много. Ты спас меня много. Фактически это значение байта не является типом изображения, это файл PDF. но я узнал это при написании байтов в txt. Теперь я решил свою ошибку. Ваша помощь действительно подтверждена – shobia

 Смежные вопросы

  • Нет связанных вопросов^_^