2016-08-05 4 views
0

Изображение на столе - это тип изображения IMAGE/PJPEG.Ошибка параметра, отображающая jpeg из массива байтов

Я потянул изображение BLOB вниз, и мне просто нужно отобразить его либо в окне изображения, либо, поскольку я сейчас пытаюсь создать столбец изображений. Однако, я думаю, что моя проблема связана с тем, что изображения являются JPEG. Не знаете, как это исправить.

For i As Integer = DataGridView1.Rows.Count - 1 To 0 Step -1 

     Dim MTI_Image As Byte() 

     STSQL = "Select IMAGE from mpcs.image_resource WHERE IMAGE_NAME = '01400010016.jpg'" 

     rsMPCS = MPCS_SELECT_SQL(UCase(STSQL), rsMPCS) 
     rsMPCS.Read() 
     MTI_Image = rsMPCS("IMAGE") 
     rsMPCS.Close() 

     Using memory As MemoryStream = New MemoryStream(MTI_Image) 

      'Dim newImage = Image.FromStream(memory) 'didn't work 
      Dim newImage As Bitmap = New Bitmap(memory) 'ERROR HERE 

      Dim ColImage As New DataGridViewImageColumn 
      Dim Img As New DataGridViewImageCell 
      DataGridView1.Columns.Add(ColImage) 
      ColImage.HeaderText = "Image" 
      ColImage.Name = "ColImg" 
      Img.Value = newImage 
      DataGridView1.Rows(0).Cells.Add(Img) 

     End Using 
    Next 

Так изображение было вставлено.

 Dim temp As String = OpenFileDialog1.FileName 
     Dim FileStream As Stream = System.IO.File.OpenRead((temp)) 
     Dim array() As Byte = File.ReadAllBytes(temp) 

     Using memory As MemoryStream = New MemoryStream(array) 
      Using reader As BinaryReader = New BinaryReader(memory) 

И то значение, которое используется для вставки reader.ReadByte

Есть ли что-то здесь развращает это как-то, что мешает мне от его отображения?

UPDATE

Так После использования изображения я знаю работу (5 пытавшейся я знаю работу). Мне сказали, что для этого столбца/столбца нет DATA, используя приведенный ниже код.

For i As Integer = DataGridView1.Rows.Count - 1 To 0 Step -1 

     STSQL = "Select IMAGE from MPCS.IMAGE_RESOURCE WHERE IMAGE_NAME = 'ThermalEtch.JPG'" 

     rsMPCS = MPCS_SELECT_SQL(UCase(STSQL), rsMPCS) 

     rsMPCS.Read() 
     Dim byteImage() As Byte = rsMPCS("IMAGE") 'ERROR HERE. 

     Using memory As MemoryStream = New MemoryStream(byteImage) 

      Dim newimage As Bitmap = New Bitmap(memory) 

      Dim ColImage As New DataGridViewImageColumn 
      Dim Img As New DataGridViewImageCell 
      DataGridView1.Columns.Add(ColImage) 
      ColImage.HeaderText = "Image" 
      ColImage.Name = "Image" 
      Img.Value = newimage 
      DataGridView1.Rows(i).Cells.Add(Img) 

     End Using 
    Next 

Вот MPCS_SLECT_SQL

Public Function MPCS_SELECT_SQL(ByVal strSQL As String, Optional ByRef readerObj As OleDbDataReader = Nothing) As OleDbDataReader 'ADODB.Recordset 
    Try 


     If OPEN_CONNECTIONS() = False Then 
      MessageBox.Show("Error connecting to database.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop) 
      MPCS_SELECT_SQL = Nothing 
      Exit Function 
     Else 


      If Not readerObj Is Nothing Then 
       If readerObj.IsClosed - False Then readerObj.Close() 
      End If 
      Dim cmdMPCS As OleDbCommand = New OleDbCommand(strSQL, conMPCS) 

      MPCS_SELECT_SQL = cmdMPCS.ExecuteReader() 
      cmdMPCS.Dispose() 

     End If 

    Catch ex As Exception 
     MessageBox.Show(ex.ToString & "  " & strSQL) 
     Stop 
     Return Nothing 
    End Try 

End Function 
+0

Код «Новый битмап (память)» работает для меня с файлами JPEG, как базовыми, так и прогрессивными. Если я повреждаю данные (например, записываю нули в первые 10 байтов), я получаю «ArgumentException: параметр недействителен». Поэтому я подозреваю, что ваши данные изображения повреждены либо в базе данных, либо из-за того, как вы загружаете данные. – Mark

+0

Привет, Марк, я подумал, может быть, это может быть проблемой, но не был уверен. Я обновил свой пост, чтобы показать, как он был добавлен. Может, он проливает свет? – Lee

+2

Лучше покажите нам больше этого кода вставки. Не похоже, что вы сохраняете все байты, если все, что вы делаете, это ReadByte. – LarsTech

ответ

0

Для чтения BLOB данных из Oracle, вам, возможно, придется использовать GetBytes и буфер для создания вашего MemoryStream. У меня нет Oracle, чтобы проверить с, но что-то вроде этого работал с SQL Server ...

rsMPCS = MPCS_SELECT_SQL(UCase(STSQL), rsMPCS) 
rsMPCS.Read() 

Dim bufferSize = 10000 
Using ms = New MemoryStream() 
    Dim buffer(bufferSize - 1) As Byte 
    Dim pos = 0L 
    Dim bytesRead = rsMPCS.GetBytes(0, pos, buffer, 0, bufferSize) 
    While bytesRead > 0 
     ms.Write(buffer, 0, CInt(bytesRead)) 
     pos += bytesRead 
     bytesRead = rsMPCS.GetBytes(0, pos, buffer, 0, bufferSize) 
    End While 
    Dim newimage = New Bitmap(ms) 
    '... add to grid 
End Using 

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

+0

Хмм, я получаю ту же ошибку. Для столбца строки нет данных. И я пошел в разработчик SQL и проверил, что изображение существует для того, с которым я тестирую. – Lee

+0

Хмм, от [этого ответа] (http://stackoverflow.com/a/10222439/2278086) - в соответствии с [this] (https://support.microsoft.com/en-us/kb/244661), в зависимости от на каком провайдере вы используете, BLOB может не поддерживаться. Есть ли причина, по которой вы не используете управляемый драйвер Oracle .NET - [ODP.NET] (http://www.oracle.com/technetwork/topics/dotnet/index-085163.html) - вместо этого? Извините, у меня нет Oracle для тестирования, поэтому, возможно, не намного больше я могу это сделать. – Mark

+0

Я взял этот проект от кого-то, кто сделал около 75% его, может быть, 5 лет назад, которого больше нет здесь, и ODP не использовался повсюду.Я не часто использую VB, не уверен, могу ли я просто использовать ODP в этом случае, поскольку OraOLEDB используется в другом месте или нет. – Lee

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

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