2016-08-05 43 views
0

Das Bild auf der Tabelle ist Bildtyp IMAGE/PJPEG.Parameter Fehler Anzeige JPEG von Byte-Array

Ich ziehe das BLOB-Bild nach unten, und ich muss es nur entweder in einer Bildbox anzeigen oder ich versuche jetzt eine Bildspalte. Ich glaube jedoch, dass mein Problem darin besteht, dass die Bilder ein JPEG sind. Ich bin mir nicht sicher, wie ich das beheben kann.

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 

So wurde das Bild eingefügt.

 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) 

Und dann wird der Wert auf Insert verwendet wurde reader.ReadByte

Gibt es hier etwas verdirbt es irgendwie, dass ich aus stoppt es angezeigt wird?

UPDATE

So ein Bild nach der Verwendung Ich weiß Werke (versuchte 5 I Werke kennen). Mir wurde gesagt, dass es für diese Zeile/Spalte keine Daten gibt, die den folgenden Code verwenden.

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 

Hier MPCS_SLECT_SQL

ist
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

Der 'New Bitmap (Speicher)' Code funktioniert für mich mit JPEG-Dateien, sowohl Baseline als auch Progressive. Wenn ich die Daten beschädige (z. B. schreibe Nullen in die ersten 10 Bytes), dann bekomme ich "ArgumentException: Parameter ist nicht gültig.". Also, ich vermute, dass Ihre Bilddaten beschädigt sind, entweder in der Datenbank oder aufgrund wie Sie die Daten laden. – Mark

+0

Hallo Markus, ich dachte, das könnte vielleicht das Problem sein, war mir aber nicht sicher. Ich habe meinen Beitrag aktualisiert, um zu zeigen, wie er hinzugefügt wurde. Vielleicht wirft es etwas Licht? – Lee

+2

Zeige uns mehr von diesem Code. Es sieht nicht so aus, als ob Sie alle Bytes speichern, wenn Sie nur ReadByte verwenden. – LarsTech

Antwort

0

Um BLOB-Daten von Oracle zu lesen, müssen Sie GetBytes und einen Puffer verwenden, um Ihre MemoryStream aufzubauen. Ich habe keine Oracle mit zu testen, aber so etwas wie dies mit SQL Server gearbeitet ...

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 

ich in einem Hilfsmethode setzen würde dies den Code zu bereinigen.

+0

Hmm, ich bekomme genau den gleichen Fehler. Für die Zeilenspalte sind keine Daten vorhanden. Und ich ging in den SQL-Entwickler und vergewissere mich, dass das Bild für den existiert, mit dem ich gerade teste. – Lee

+0

Hmm, von [diese Antwort] (http://stackoverflow.com/a/10222439/2278086) - je nach [dieser] (https://support.microsoft.com/en-us/kb/244661), abhängig Auf welchem ​​Provider Sie arbeiten, BLOB wird möglicherweise nicht unterstützt. Gibt es einen Grund, warum Sie nicht den nativen .NET-Client von Oracle - [ODP.NET] (http://www.oracle.com/technetwork/topics/dotnet/index-085163.html) - verwalteten Treiber verwenden? Entschuldigung, ich habe kein Oracle zum Testen, also kann ich vielleicht nicht viel mehr tun. – Mark

+0

Ich habe dieses Projekt von jemandem abgeholt, der vor etwa 5 Jahren etwa 75% davon gemacht hat, der nicht mehr hier ist und ODP nicht überall benutzt wurde.Ich benutze VB nicht oft, nicht sicher, ob ich ODP in diesem Fall einfach verwenden kann, da OraOLEDB woanders verwendet wird oder nicht. – Lee