您好我正在尝试将已调整大小的图像从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)
如果有人可以告诉我我做错了什么,那就太好了。
答案 0 :(得分:2)
你对这一小段代码进行了很多讨论:
Byte()
我会通过个别方法执行每一步。您还有多个变量引用相同的内容:Obrazek
,img
,PictureBox1.Image
和ResizeImage
都引用相同的图像对象。如果要在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上所述,它可能会导致字节数组远大于它需要的数量,并导致数据库膨胀。SQL.AddParam
是什么 - 它看起来像某种DB“助手”。考虑到params几乎不得不使用AddWithValue
而不建议。没有那么多涉及它需要帮助。