#vb.net #visual-studio-2010 #image #sql-server-2008
#vb.net #visual-studio-2010 #изображение #sql-server-2008
Вопрос:
Вот код, который я использовал для хранения изображения в моей базе данных (SQL Server 2008 R2) с использованием VB 2010. Изображения сохраняются, но проблема в том, что четкость изображения теряется при извлечении и просмотре в окне изображения.
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. Я думаю, вам нужно включить дополнительную информацию о том, как вы извлекаете изображение и отображаете его.
Ответ №1:
Функция image.save() снижает качество изображения (если оно сохранено в формате Jpeg) до уровня сжатия по умолчанию, составляющего около 75%.
Пожалуйста, ознакомьтесь с этой статьей MSDN о повышении этого уровня качества, когда вы вызываете Save, передавая myEncoderParameters, содержащий уровень качества на гораздо более высоком уровне (скажем, 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)