2008-10-08 5 views

Répondre

1

En supposant:

  • vous utilisez le client Microsoft (System.Data.OracleClient).
  • vous avez une instance OracleConnection appropriée (connection).
  • vous avez un OracleCommand prêt (command, basé sur SELECT my_blob FROM my_table WHERE id=xx).

Cela devrait se présenter comme suit:

using (OracleDataReader odr=command.ExecuteReader()) 
{ 
    reader.Read(); 

    if (!dr.IsDBNull(0)) 
     using (Stream s=(Stream)dr.GetOracleValue(0)) 
      using (Image image=Image.FromStream(s)) 
       return Copy(image); 
} 

où Copy est

public static Image Copy(Image original) 
{ 
    Image ret=new Bitmap(original.Width, original.Height); 
    using (Graphics g=Graphics.FromImage(ret)) 
    { 
     g.DrawImageUnscaled(original, 0, 0); 
     g.Save(); 
    } 

    return ret; 
} 

Voir my blog post et/ou KB 814675 pourquoi une copie est nécessaire.

0

Je sais cela utilise sql mais il devrait être similaire pour vos besoins

Dim cn As SqlConnection = Nothing 
     Dim cmd As SqlCommand = Nothing 
     Dim da As SqlDataAdapter = Nothing 
     Dim ms As MemoryStream = Nothing 
     Dim dsImage As Data.DataSet = Nothing 
     Dim myBytes() As Byte = Nothing 
     Dim imgJPG As System.Drawing.Image = Nothing 
     Dim msOut As MemoryStream = Nothing 

     Try 
      cn = New SqlConnection(ConnectionStrings("conImageDB").ToString) 
      cmd = New SqlCommand(AppSettings("sprocGetImage").ToString, cn) 
      cmd.CommandType = Data.CommandType.StoredProcedure 

      cmd.Parameters.AddWithValue("@dmhiRowno", irowno) 

      da = New SqlDataAdapter(cmd) 

      dsImage = New Data.DataSet 
      da.Fill(dsImage, "image") 

      If dsImage.Tables(0).Rows.Count = 0 Then 
       Throw New Exception("No results returned for rowno") 
      End If 
      myBytes = dsImage.Tables(0).Rows(0)("Frontimage") 

      ms = New MemoryStream 
      ms.Write(myBytes, 0, myBytes.Length) 

      imgJPG = System.Drawing.Image.FromStream(ms) 

      'Export to JPG Stream 
      msOut = New MemoryStream 
      imgJPG.Save(msOut, System.Drawing.Imaging.ImageFormat.Jpeg) 
      imgJPG.Dispose() 
      imgJPG = Nothing 
      ms.Close() 
      sFrontImage = Convert.ToBase64String(msOut.ToArray()) 

      dsImage = New Data.DataSet 
      da.Fill(dsImage, "image") 
      myBytes = dsImage.Tables(0).Rows(0)("Backimage") 

      ms = New MemoryStream 
      ms.Write(myBytes, 0, myBytes.Length) 

      imgJPG = System.Drawing.Image.FromStream(ms) 
      sBackImage = Convert.ToBase64String(ms.ToArray) 

     Catch ex As System.IO.IOException ' : An I/O error occurs. 
      Throw ex 
     Catch ex As System.ArgumentNullException ': buffer is null. 
      Throw ex 
     Catch ex As System.NotSupportedException ': The stream does not support writing. For additional information see System.IO.Stream.CanWrite.-or- The current position is closer than count bytes to the end of the stream, and the capacity cannot be modified. 
      Throw ex 
     Catch ex As System.ArgumentOutOfRangeException ': offset or count are negative. 
      Throw ex 
     Catch ex As System.ObjectDisposedException ' : The current stream instance is closed. 
      Throw ex 
     Catch ex As System.ArgumentException 
      Throw ex 
     Catch ex As System.Runtime.InteropServices.ExternalException ': The image was saved with the wrong image format 
      Throw ex 
     Catch ex As Exception 
      Throw ex 
     Finally 
      If cn IsNot Nothing Then 
       cn.Close() 
       cn.Dispose() 
       cn = Nothing 
      End If 

      If cmd IsNot Nothing Then 
       cmd.Dispose() 
       cmd = Nothing 
      End If 

      If da IsNot Nothing Then 
       da.Dispose() 
       da = Nothing 
      End If 

      If ms IsNot Nothing Then 
       ms.Dispose() 
       ms = Nothing 
      End If 

      If msOut IsNot Nothing Then 
       msOut.Close() 
       msOut.Dispose() 
       msOut = Nothing 
      End If 

      If dsImage IsNot Nothing Then 
       dsImage.Dispose() 
       dsImage = Nothing 
      End If 

      If myBytes IsNot Nothing Then 
       myBytes = Nothing 
      End If 

      If imgJPG IsNot Nothing Then 
       imgJPG.Dispose() 
       imgJPG = Nothing 
      End If 

     End Try 

Ce code retire un jpeg enveloppé tiff pour l'image avant de sorte que le code est un peu différent de celui de l'image en arrière.

Questions connexes