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

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.ValueByte 数组。两端都没有 Stream 所以你的命名是错误的。当您可以 Save Image 时,从 Image 创建 Bitmap 来保存也没有意义。如果您想将数据库中的数据保存到文件中,那么创建 Image 对象并保存它是没有意义的。调用File.WriteAllBytes直接保存Byte数组