我正在尝试将图像保存到列类型设置为image的MSSQL数据库表中,我的应用程序的目的是将用户上传的图像保存到数据库中,以后的用户可以从数据库中检索这些图像,如果需要保存到磁盘。
我已经编写了以下代码来成功完成此任务,但是,当我将图像保存到从数据库中检索到的磁盘时,文件大小似乎小于原始大小。
这自然意味着在保存时图像的质量降低了,或者我没有正确检索图像。
此代码用于从数据库中检索图像。
Public Function __IMAGE_FROM_STREAM(ByVal img As Object) As Image
__IMAGE_FROM_STREAM = Nothing
If Not IsDBNull(img) Then
Using mStream As New MemoryStream(img, 0, img.Length)
mStream.Write(img, 0, img.Length)
__IMAGE_FROM_STREAM = Image.FromStream(mStream, True)
End Using
End If
Return __IMAGE_FROM_STREAM
End Function
此代码用于将传入的图像保存到数据库。
Public Function __IMAGE_TO_STREAM(ByVal image As Image) As Byte()
__IMAGE_TO_STREAM = Nothing
If Not image Is Nothing Then
Using mStream As New MemoryStream
Dim bm As Bitmap = New Bitmap(image)
bm.Save(mStream, image.RawFormat)
__IMAGE_TO_STREAM = mStream.GetBuffer
End Using
End If
Return __IMAGE_TO_STREAM
End Function
此代码用于将检索到的图像保存到磁盘中。
sfdExportImage.FileName = "export_" & DateTime.Now.ToString("d").Replace("/", "") & "_" & sender.Tag
If sfdExportImage.ShowDialog() = DialogResult.OK Then
Dim fileName As String = sfdExportImage.FileName
Dim expImage As Image = flpImageContainer.Controls("flpWrap_" & sender.Tag).Controls(0).BackgroundImage
Try
If expImage IsNot Nothing Then
expImage.Save(fileName)
MessageBox.Show("File exported successfully to " & fileName, __COMPANYNAME, MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Catch ex As Exception
__WRITELOG(ex)
End Try
End If
我已经查找了这个问题,但是没有类似的问题,我是否缺少任何编码参数,我没有使用图像及其类,因此感谢您的反馈。谢谢。
Public Function ImageFromDbData(data As Object) As Image
If data Is DBNull.Value Then
Return Nothing
End If
Using strm As New MemoryStream(DirectCast(data, Byte()))
Return Image.FromStream(strm)
End Using
End Function
Public Function ImageToDbData(img As Image) As Object
If img Is Nothing Then
Return DBNull.Value
End If
Using strm As New MemoryStream
img.Save(strm, img.RawFormat)
Return strm.ToArray()
End Using
End Function
它们将直接往返于数据库值,即DBNull.Value
或Byte
数组。末尾没有Stream
,因此您的命名是错误的。当您只需Bitmap
Image
时,从Save
创建Image
进行保存也没有意义。如果要将数据从数据库保存到文件,则没有必要创建Image
对象并将其保存。只需调用File.WriteAllBytes
直接保存Byte
数组即可。