2016-08-05 9 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

だっ挿入するために使用される値は何かここでそれはそれを表示するから私を停止している何とかそれを破損はありますか? (私は作品を知っている5試してみました)

UPDATEだから画像を使用した後、私は作品を知っています。私はその行/列の下のコードを使用して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バイトに0を書き込む場合)、「ArgumentException:Parameter is not valid。」というメッセージが表示されます。だから、私はあなたのイメージデータが壊れていると思っています、どちらかのデータベースやデータの読み込み方法です。 – Mark

+0

こんにちはマーク、私は問題かもしれないが、確かではないと思った。私はどのように追加されたのかを示すために投稿を更新しました。多分それはいくつかの光を発するでしょうか? – Lee

+2

もっとよく挿入コードを見せてください。あなたがしていることがすべてReadByteであれば、すべてのバイトを保存しているようには見えません。 – LarsTech

答えて

0

は、OracleからのBLOBデータを読み取るには、あなたがあなたのMemoryStreamを構築するGetBytesし、バッファを使用する必要があります。私はOracleがでテストする必要はありませんが、このようなものは、私は、コードをクリーンアップするヘルパーメソッドでこれを置く

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 

... SQL Serverと働きました。

+0

ええと、まったく同じエラーが出ます。行の列にはデータがありません。そして私はSQL開発者に行き、私がテストしているもののイメージが存在することを確認しました。 – Lee

+0

[この回答](http://stackoverflow.com/a/10222439/2278086) - [こちら](https://support.microsoft.com/en-us/kb/244661)によると、あなたが使用しているプロバイダでBLOBがサポートされていない可能性があります。 Oracleのネイティブ.NETクライアントである[ODP.NET](http://www.oracle.com/technetwork/topics/dotnet/index-085163.html)の管理対象ドライバを使用していない理由はありますか?申し訳ありませんが、オラクル社でテストする必要はありません。おそらくこれ以上はできません。 – Mark

+0

私はこのプロジェクトを5年前に約75%の価値があった人から迎え入れました。ここではもはやここにいなくて、ODPは全面的に使われていませんでした。OraOLEDBは他の場所で使用されているため、このインスタンスでODPを使用できるかどうかはわかりませんが、VBを頻繁に使用しません。 – Lee

関連する問題