Сохранить изображение на диск из базы данных с тем же размером и качеством, что и исходное изображение - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь сохранить изображения в таблице базы данных MS SQL, в которой для типа столбца установлено значение image, цель моего приложения - сохранить загруженные пользователем изображения в базу данных, и пользователи в дальнейшем смогут получать эти изображения из базы данных и при необходимости сохранить на диск.

Я уже написал приведенный ниже код для успешного решения этой задачи, однако при сохранении образа на диск, который извлекается из базы данных, размер файла кажется ниже чем оригинальный размер.

Это, естественно, означает, что качество изображения было уменьшено при сохранении, или я не получаю изображение должным образом.

Этот код используется для получения изображение из базы данных.

    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

This Код используется для сохранения полученного изображения на диск.

    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

Я посмотрел эту проблему, но у меня не возникло подобных вопросов, я пропустил какие-либо параметры кодирования, с которыми я не работал изображения и их классы много, так что ваши отзывы приветствуются. Спасибо.

1 Ответ

1 голос
/ 15 апреля 2020

В этом коде много хитрости. Вот как должны выглядеть ваши методы:

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

Они будут go напрямую в значение базы данных и из него, т.е. DBNull.Value или массив Byte. На обоих концах нет Stream, поэтому ваше имя неверно. Также нет смысла создавать Bitmap из Image для сохранения, когда вы можете просто Save Image. Если вы хотите сохранить данные из базы данных в файл, нет смысла создавать объект Image и сохранять его. Просто позвоните File.WriteAllBytes, чтобы сохранить массив Byte напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...