将调整大小的图像保存到数据库时出错

时间:2016-09-21 11:20:40

标签: .net database vb.net

您好我正在尝试将已调整大小的图像从Picturebox保存到数据库。我有这段代码:

Dim Obrazek As Image
    If OpenFileDialog1.ShowDialog = DialogResult.OK Then

        PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)

        '516, 387
        Dim NewSize As New Size(773, 580)
        ResizeImage = New Bitmap(PictureBox1.Image, NewSize)
        PictureBox1.Image = ResizeImage
        Obrazek = ResizeImage


    End If



    Dim ImageIDShop As String = "0000"
    'Get Image Via Memory stream
    Dim img As Image = Obrazek
    Dim ms As New MemoryStream
    img.Save(ms, img.RawFormat)
    Dim buffer As Byte() = ms.GetBuffer

    'Add SQL Parameters
    SQL.AddParam("@ImageIDShop", ImageIDShop)
    SQL.AddParam("@imageString", buffer)

    SQL.QueryArcades("INSERT INTO [dbo].[ImageTable]
                               ([ImageIDShop]
                               ,[ImageString])
                         VALUES
                               (@ImageIDShop
                               ,@imageString) ")

    ResizeImage.Dispose()

    MsgBox("Saved")

这两个部分分开工作,但我在一起有错误:

System.Drawing.dll中出现未处理的“System.ArgumentNullException”类型异常

附加信息:值不能为空。

在线:

 img.Save(ms, img.RawFormat)

我是尝试从磁盘上的Picture框中保存已调整大小的图像,然后将其发送到数据库,但后来我有不同的错误。我可以使用saveopendialog保存文件,但我不能使用简单的代码:

ResizeImage.Save("ImageName.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

如果有人可以告诉我我做错了什么,那就太好了。

1 个答案:

答案 0 :(得分:2)

你对这一小段代码进行了很多讨论:

  1. 与用户交互以选择图像(?)文件
  2. 调整大小(代码实际上没有这样做,但看起来应该是这样)
  3. 将图片转换为Byte()
  4. 保存到数据库
  5. 我会通过个别方法执行每一步。您还有多个变量引用相同的内容:ObrazekimgPictureBox1.ImageResizeImage都引用相同的图像对象。如果要在PictureBox中显示原始图像或已调整大小的图像,则无法对其进行处理。你可能会得到一个大的红色X.

    ' 1: get selected image form user
    If OpenFileDialog1.ShowDialog <> DialogResult.OK Then Return
    
    Dim imgData As Byte()
    Using selectedImg As Image = Image.FromFile(OpenFileDialog1.FileName)
    
        Using imgThumb As New Bitmap(selectedImg.Width \ 2, selectedImg.Height \ 2),
             g = Graphics.FromImage(imgThumb)
    
            ' 2: create resized image
            g.DrawImage(selectedImg, 0, 0, imgThumb.Width, imgThumb.Height)
            ' cannot use a Disposed image
            'pBox.Image = imgThumb
    
            ' 3: convert to byte()
            Using ms As New MemoryStream()
                imgThumb.Save(ms, ImageFormat.Jpeg)
                ' Do NOT use getbuffer!
                imgData = ms.ToArray()
            End Using
    
        End Using
    End Using
    
    Dim ImageIDShop As String = "0000"
    
    ' 4: save to DB
    Using dbCon As New MySqlConnection(MySQLConnStr),
        cmd As New MySqlCommand("INSERT INTO BlobDemo (itemName, itemType, imgData) VALUES (@p1, @p2, @p3)", dbCon)
    
        cmd.Parameters.Add("@p1", MySqlDbType.String).Value = ImageIDShop
        cmd.Parameters.Add("@p2", MySqlDbType.String).Value = "jpg"
        cmd.Parameters.Add("@p3", MySqlDbType.Blob).Value = imgData
    
        dbCon.Open()
        cmd.ExecuteNonQuery()
    End Using
    

    注释

    • 这会创建一个调整大小的图像,原始图像的宽度和高度的一半。您可能想要检查原件是否需要调整大小
    • 代码实现using块来处理那些应该处理的东西
    • 如果您要保留原始广告或已调整大小的广告,请将其从Using
    • 中删除
    • 不要使用GetBuffer() - 如MSDN上所述,它可能会导致字节数组远大于它需要的数量,并导致数据库膨胀。
    • 您可能希望实际编码生成的已调整大小的图像,而不是保存RawFormat
    • 我不知道SQL.AddParam是什么 - 它看起来像某种DB“助手”。考虑到params几乎不得不使用AddWithValue而不建议。没有那么多涉及它需要帮助。