2014-10-20 2 views
0

, когда я пытаюсь захватить изображение на свою веб-камеру в VB.NET с помощью Emgu и скопировать его в другой PictureBox в другой форме с этим кодом Form23.PictureBox1.Image = New Bitmap(captureImageBox.Image) и попытаться сохранить его в моей базе данных, он не сохраняется и появляется ошибка Empty path name is not legal, но изображение есть и скопировано с веб-камеры PictureBox.Как сохранить изображение PictureBox в DB

это мой код в сохранении изображения в базе данных:

Dim a As OpenFileDialog = New OpenFileDialog 

SQL = "UPDATE candidate SET photo='" [email protected] WHERE idn='" & cd & "'" 
     Dim sqlCommand As New MySqlCommand 
     sqlCommand.Parameters.Add("@photo", MySqlDbType.LongBlob) 
     sqlCommand.Parameters("@photo").Value = IO.File.ReadAllBytes(a.FileName) 

     With sqlCommand 
      .CommandText = SQL 
      .Connection = sConnection 
      .ExecuteNonQuery() 

но если я сохранить изображение из OpenFileDialog экономит. почему это не так? hmm есть ли проблема в моем коде при копировании изображения из PictureBox в другой?

UPDATE

попытался это, но он не работает либо:

Заменено это:

sqlCommand.Parameters.Add("@photo", MySqlDbType.LongBlob) 
     sqlCommand.Parameters("@photo").Value = IO.File.ReadAllBytes(a.FileName) 

     With sqlCommand 
      .CommandText = SQL 
      .Connection = sConnection 
      .ExecuteNonQuery() 

с этим:

Dim ms As New IO.MemoryStream() 
PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat) 
Dim data As Byte() = MS.GetBuffer() 
Dim p As New MySqlParameter("@photo", MySqlDbType.LongBlob) 
p.Value = data 
cmd.Parameters.Add(p) 
sqlCommand.Parameters.Add("@cd", MySqlDbType.Int32).Value = cd 
cmd.ExecuteNonQuery() 
+0

код Вы отправили не компилируется. Йо должно делать что-то другое. –

+0

текст не соответствует коду. вы пытаетесь сохранить файлы байтов (код) или 'PictureBox1.Image' (вопрос)? и если вы сейчас создаете свои формы, «Form23 ...» будет неправильным. – Plutonix

+0

Используйте отладчик. Поместите точку останова на строку ReadAllBytes и посмотрите на значение a.FileName – Steve

ответ

2

Оговорка: Я понятия не имею, какую роль играет FileDialog во всем этом. Сохранение изображения из PictureBox в базу данных не связано с файлом или файловым диалогом. Этот адрес Нотариального вопрос, не обновляется, когда файлы и диалоги Ползучесть.

Во-первых, рассмотрим не хранения изображения, но имя архивной копии файла. Вы можете использовать их как в <id>_<orgfilename>.<ext>, если хотите вставить идентификатор в файл на диске.

Чтобы сохранить изображение в виде изображения, его необходимо преобразовать в массив байтов. Net включает в себя преобразователь типа для этого:

Dim imgData As Byte()   ' storage for the img bytes 

Dim cvt As New ImageConverter 
imgData = CType(cvt.ConvertTo(myImage, GetType(Byte())), Byte()) 

Он работает (как правило), но это также делает бокс вперед и назад от объекта (CType) и вопросов с ImageFormat он выбирает ошибке меня. Делать это самостоятельно очень просто:

' this is easily used from a class or converted to an extension 
Public Shared Function ImgToByteArray(img As Image, imgFormat As ImageFormat) As Byte() 
    Dim tmpData As Byte() 
    Using ms As New MemoryStream() 
     img.Save(ms, imgFormat) 

     tmpData = ms.ToArray 
    End Using    ' dispose of memstream 
    Return tmpData 
End Function 

Это довольно много, что TypeConverter делает без бокса, но код управляет форматом. Затем сохраните массив байтов в БД:

Dim imgData As Byte()   ' storage for the img bytes 
imgData = ImgToByteArray(PictureBox1.Image, ImageFormat.Jpeg) 

... 
sqlCommand.Parameters("@photo").Value = imgData 

Если вы хотите более общая процедура, чтобы сохранить из файла или PictureBox, создать процедуру, которая принимает массив байтов в качестве Param. Кнопка нажмите на Сохранить PictureBoxImage может преобразовать изображение в массив байтов и передать его, как может другая кнопка работает из файла:

Function SaveRecord(ingData As Byte(),...other params...) As Boolean 

Примечание: Не используйте GetBuffer. См. MSDN MemoryStream.GetBuffer:

Обратите внимание, что буфер содержит выделенные байты, которые могут быть неиспользуемыми. Например, если строка «test» записывается в объект MemoryStream , длина буфера, возвращаемого из GetBuffer , равна 256, а не 4, а 252 байта не используется. ...

На 968012 байт файла, .ToArray возвращает правильный размер, GetBuffer возвращает 1,719,296 со всеми элементами после 968012 является Null.


С помощью всего лишь немного работы вы можете создать класс хелперов изображения:

Public Class myImaging 

    ' image to byte array from file name 
    Public Shared Function ImgToByteArray(imgFile As String, 
       imgFormat As ImageFormat) As Byte() 
     ... 

    ' the one above 
    Public Shared Function ImgToByteArray(img As Image, 
      imgFormat As ImageFormat) As Byte() 
     ... 

    ' going the other way Bytes() --> Image 
    Public Shared Function ImgFromByteArray(b As Byte()) As Image 
     ... 

    ' shrink img and scale it 
    Public Shared Function ImgToThumb(img As Image, maxSize As Size) As Image 

End Class 

Тогда это просто: imgData = myImaging.ImgToByteArray(picturebox84.Image)

0
Dim a As OpenFileDialog = New OpenFileDialog 
'... 

SQL = "UPDATE candidate SET photo= @photo WHERE idn= @cd" 
Dim sqlCommand As New MySqlCommand(SQL, sConnection) 
sqlCommand.Parameters.Add("@photo", MySqlDbType.LongBlob).Value = IO.File.ReadAllBytes(a.FileName) 
sqlCommand.Parameters.Add("@cd", MySqlDbtype.Int32).Value = cd 

sConnection.Open() 
sqlCommand.ExecuteNonQuery() 
+0

появляется ошибка «Пустой путь не является юридическим», и он указывает здесь 'sqlCommand.Parameters.Add (« @ photo », MySqlDbType.LongBlob) .Value = IO.File.ReadAllBytes (a.FileName)', я это знаю читает файл, открытый открытием 'OpenFileDialog', но я не знаю, что здесь положить, не могли бы вы мне помочь? –

+0

В нем написано «Пустой путь». Как-то a.Filename не имеет значения. –

0

получил ответ!

Dim cn As New MySqlConnection("server = localhost; user id = root; database = db; password = root") 
     Dim sqlQuery As String = "UPDATE candidate SET [email protected], [email protected], candidacy='Filed', [email protected] WHERE [email protected]" 
     Dim sqlcom As New MySqlCommand(sqlQuery, cn) 
     Dim ms As New IO.MemoryStream() 
     PictureBox1.Image.Save(ms, Imaging.ImageFormat.Jpeg) 
     Dim data As Byte() = ms.GetBuffer() 
     Dim p As New MySqlParameter("@photo", MySqlDbType.LongBlob) 
     p.Value = data 
     sqlcom.Parameters.Add(p) 
     sqlcom.Parameters.AddWithValue("@cpos", ComboBox1.Text) 
     sqlcom.Parameters.AddWithValue("@cparty", TextBox1.Text) 
     sqlcom.Parameters.Add("@cd", MySqlDbType.Int32).Value = cd 
     cn.Open() 
     sqlcom.ExecuteNonQuery() 
+0

вам нужно закрыть и утилизировать свой мейнстрим. Используйте блок 'Using' ... и не используйте' GetBuffer' – Plutonix

+0

, можно ли использовать 'ms.Close'? Я не знаю, как использовать 'Using', что я должен использовать с' GetBuffer'? –

+1

ответ в ... ну ответ;) – Plutonix

Смежные вопросы