在数据库中存储和检索图像

时间:2011-10-05 07:02:34

标签: vb.net visual-studio-2010 image sql-server-2008

以下是我使用VB 2010在我的数据库(SQL Server 2008 R2)中存储图像的代码。 图像被存储但问题是在图片框中检索和查看时图像的清晰度会丢失。

Public Function InsertUpdateImage(ByRef _SqlConnection As System.Data.SqlClient.SqlConnection, ByVal _Image As System.Drawing.Image, ByVal _ImageFormat As System.Drawing.Imaging.ImageFormat) As Integer
    Dim _SqlRetVal As Integer = 0
    'System.IO.Path.GetFullPath(files(ListView1.SelectedIndices(0))) Give the path for the 'image from listview 
    Dim str As String = System.IO.Path.GetFullPath(files(ListView1.SelectedIndices(0)))
    Dim i As Integer = Len(str)
    Dim j As Integer = 0
    Dim locstr(i + 10) As Char
    i = 0
    While i < Len(str)
        If str(i) = "\" Then
            locstr(j) = "\"
            j = j + 1
        Else
            locstr(j) = str(i)
            j = j + 1
        End If
        i = i + 1
    End While
    Dim loc As New String(locstr)
    MsgBox(loc)

    ' lets add this record to database
    Dim _SqlCommand As New System.Data.SqlClient.SqlCommand("insert into maindb(photo,name,location) values(@image,'" + System.IO.Path.GetFileName(files(ListView1.SelectedIndices(0))) + "','" + loc + "')", _SqlConnection)

    ' Convert image to memory stream
    Dim _MemoryStream As New System.IO.MemoryStream()
    _Image.Save(_MemoryStream, _ImageFormat)

    ' Add image as SQL parameter
    Dim _SqlParameter As New System.Data.SqlClient.SqlParameter("@image", SqlDbType.Image)
    _SqlParameter.Value = _MemoryStream.ToArray()

    _SqlCommand.Parameters.Add(_SqlParameter)

    ' Executes a Transact-SQL statement against the connection 
    ' and returns the number of rows affected.
    _SqlRetVal = _SqlCommand.ExecuteNonQuery()
    Console.Write(_SqlRetVal)
    ' Dispose command
    _SqlCommand.Dispose()
    _SqlCommand = Nothing

    ' Error occurred while trying to execute reader
    ' send error message to console (change below line to customize error handling)

    Return _SqlRetVal
End Function

1 个答案:

答案 0 :(得分:1)

您的image.save()会将图像质量(如果保存为Jpeg)降低到大约75%的默认压缩级别。

请参阅此MSDN文章,了解如何通过传入myEncoderParameters来调用Save,其中包含更高级别的质量级别(比如说90%)

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder.quality.aspx

或者看下面的(未经测试的)代码,应该做的诀窍

    ' Create a a single encoder parameter envelope
    Dim EncoderParameters As New EncoderParameters(1)

    ' Create and add a single quality parameter to this envelope, specifying 95%
    Dim QualityParam As New EncoderParameter(Encoder.Quality, CType(95L, Int32))
    EncoderParameters.Param(0) = QualityParam

    ' Save the image with the encoder param specifying 95% quality
    _image.Save(_MemoryStream, _ImageFormat, EncoderParameters)