【问题标题】:Export picturebox image to localdisk将图片框图像导出到本地磁盘
【发布时间】:2020-04-13 15:34:48
【问题描述】:

我想将图片框中的图像导出到硬盘中的某个位置,此图像是从 MSSQL 数据库表中的图像类型列中设置为图片框的。

我已经编写了以下代码来完成这项任务。但是我通过 try catch 代码得到一个通用的 GDI+ 错误。

此代码将图片框中的图像导出到保存文件对话框指定的位置。

        Dim fileName As String = exportDialog.FileName
        Dim expImage As Image = picBox.BackgroundImage
        Try
            If expImage IsNot Nothing Then
                expImage.Save(fileName)
                MessageBox.Show("File exported successfully")
            End If
        Catch ex As Exception
            __WRITELOG(ex)
        End Try

这是从数据库中获取图像并将其转换为能够显示在图片框中的代码

        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)
                '//This __IMAGE_FROM_STREAM is set as the image into the picturebox & it works....!
            End Using
        End If

我已经检查过这个问题,但是大多数其他人在保存从磁盘中的某个位置而不是数据库中加载到图片框的文件时都遇到了 GDI+ 错误。还有一些解决方案是关于不适用于这种情况的磁盘锁。感谢您提供任何支持/建议。

【问题讨论】:

  • 要么将图像的数据直接从数据库复制到磁盘,要么分配一个.Clone(一个新实例)。 picBox.BackgroundImage = Image.FromStream(mStream).Clone
  • __IMAGE_FROM_STREAM = Image.FromStream(new MemoryStream(img), True)。不要用Using 声明声明MemoryStream。在设置另一个图像之前处置图像(例如,PictureBox1?.Image.Dispose() PictureBox1.Image = [new Image])。当 Image 被释放时,底层流被释放。保存图像时,指定ImageFormat
  • @Jimi 是什么?在您的代码中,您提到了 PictureBox1?.Image.Dispose()。我不习惯?符号,我是否遗漏了什么,这是一个有效的语法。谢谢
  • 嗯,这就是 Elvis(空条件运算符)。它在访问成员之前执行null 测试。所以,如果PictureBox.Image 对象是null (Nothing),它不会尝试调用Dispose()。如果图像是null(从未分配或设置为null),它不会抛出异常。在这种情况下,它是If PictureBox.Image IsNot Nothing then PictureBox.Image.Dispose() 的快捷方式
  • @Jimi 感谢您的澄清,它在 Visual Studio 代码编辑器中显示为错误语法。

标签: vb.net visual-studio gdi+


【解决方案1】:

我不是 100% 确定,但我认为问题在于您正在处理您正在创建 ImageStream。使用Using 语句通常很好,因为它意味着自动处理创建的对象,但在这种情况下这是不可取的。保留Stream 并仅在您使用完Image 后将其丢弃,并将其也丢弃。例如,您可以创建一个自定义控件,该控件继承 PictureBox 并具有源 Stream 的属性,允许您将其与 Image 一起保留。

Imports System.IO

Public Class PictureBoxEx
    Inherits PictureBox

    Private _imageStream As Stream

    Public WriteOnly Property ImageStream As Stream
        Set
            _imageStream = Value
            Image = Image.FromStream(Value)
        End Set
    End Property

    Public Sub DisposeImageAndStream()
        Image?.Dispose()
        _imageStream?.Dispose()
    End Sub

End Class

【讨论】:

  • 基于我如何分解将流保存在内存中的文件有点问题。更改该代码可能会破坏其他一些工作功能。因此,当用户选择将图像导出到磁盘并使用该流将图像保存到磁盘时,是否可以从图片框中的图像创建一个流。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 2011-08-25
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多