将图像以与原始图像相同的大小和质量从数据库保存到磁盘中

问题描述 投票:0回答:1

我正在尝试将图像保存到列类型设置为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

我已经查找了这个问题,但是没有类似的问题,我是否缺少任何编码参数,我没有使用图像及其类,因此感谢您的反馈。谢谢。

.net vb.net visual-studio-2010
1个回答
1
投票
该代码中包含许多令人毛骨悚然的内容。这是您的方法应如下所示:

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.ValueByte数组。末尾没有Stream,因此您的命名是错误的。当您只需Bitmap Image时,从Save创建Image进行保存也没有意义。如果要将数据从数据库保存到文件,则没有必要创建Image对象并将其保存。只需调用File.WriteAllBytes直接保存Byte数组即可。
© www.soinside.com 2019 - 2024. All rights reserved.