以与原始图像相同的大小和质量将图像从数据库保存到磁盘
Save image to disk from database with same size & quality as the original image
我正在尝试将图像保存到 MSSQL 数据库 table,该数据库的列类型设置为图像,我的应用程序的目的是将用户上传的图像保存到数据库中,以后用户可以检索来自数据库的那些图像,如果需要保存到磁盘。
我已经写了下面的代码来成功完成这个任务,但是当我将一张从数据库中检索到的图像保存到磁盘时,文件大小似乎小于原始大小。
这自然意味着图像质量在保存时降低了,或者我没有正确检索图像。
此代码用于从数据库中检索图像。
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
所以你的命名是错误的。当您可以 Save
Image
时,从 Image
创建 Bitmap
来保存也没有意义。如果您想将数据库中的数据保存到文件中,那么创建 Image
对象并保存它是没有意义的。调用File.WriteAllBytes
直接保存Byte
数组
我正在尝试将图像保存到 MSSQL 数据库 table,该数据库的列类型设置为图像,我的应用程序的目的是将用户上传的图像保存到数据库中,以后用户可以检索来自数据库的那些图像,如果需要保存到磁盘。
我已经写了下面的代码来成功完成这个任务,但是当我将一张从数据库中检索到的图像保存到磁盘时,文件大小似乎小于原始大小。
这自然意味着图像质量在保存时降低了,或者我没有正确检索图像。
此代码用于从数据库中检索图像。
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
所以你的命名是错误的。当您可以 Save
Image
时,从 Image
创建 Bitmap
来保存也没有意义。如果您想将数据库中的数据保存到文件中,那么创建 Image
对象并保存它是没有意义的。调用File.WriteAllBytes
直接保存Byte
数组