Принятый и поддержанный ответ может работать, но он субоптимален и довольно расточителен:
MemoryStream
, чтобы получить изображение в массив байтов. .GetBuffer()
совершенно неверно: буфер memstream часто включает неиспользуемые, выделенные байты. С тестовым файлом 25k ToArray()
возвращает 25434 байта - правильный размер изображения, в то время как GetBuffer()
возвращает 44416. Чем больше изображение, тем больше будет пустых байтов. Это использует объекты поставщика MySQL, так как он имеет такую метку, но используемый поставщик данных (MySQL, SQLServer, OleDB и т. д.) не имеет значения: все они работают одинаково.
В случаях, когда источником изображения является PictureBox, используйте MemoryStream
:
Dim picBytes As Byte()
Using ms As New MemoryStream()
picBox1.Image.Save(ms, imgFormat)
picBytes = ms.ToArray() ' NOT GetBuffer!
End Using
. Поскольку изображение должно было откуда-то прибыть, если это файл, это все, что вам нужно:
picBytes = File.ReadAllBytes(filename)
Как только у вас есть изображение в виде байтов, чтобы сохранить:
Dim SQL = "INSERT INTO (picture, filename, filesize) VALUES(@Pic, @FileName, @FileSize)"
Using conn As New MySqlConnection(connstr)
Using cmd As New MySqlCommand(SQL, conn)
conn.Open()
cmd.Parameters.Add("@Pic", MySqlDbType.Blob).Value = picBytes
cmd.Parameters.Add("@FileName", MySqlDbType.String).Value = filename
cmd.Parameters.Add("@FileSize", MySqlDbType.Int32).Value = FileSize
cmd.ExecuteNonQuery()
End Using
End Using ' close and dispose of Connection and Command objects
Dim imgData As Byte()
'... open connection, set params etc
Using rdr As MySqlDataReader = cmd.ExecuteReader
If rdr.HasRows Then
rdr.Read()
imgData = TryCast(rdr.Item("Image"), Byte())
' in case this record has no image
If imgData IsNot Nothing Then
' ToDo: dispose of any previous Image
' create memstream from bytes
Using ms As New MemoryStream(imgData)
' create image from stream, assign to PicBox
picBox1.Image = CType(Image.FromStream(ms), Image)
End Using
End If
End If
End Using
Примечание что Bitmaps
и Images
должны быть удалены. Если вы повторно создаете новые изображения, когда пользователь просматривает базу данных, ваше приложение будет течь и в конечном итоге сбой. Если вы много конвертируете назад, вы можете написать вспомогательный или дополнительный метод для преобразования изображений в байты и наоборот.
DBConnection
и DBCommand
объекты также должны быть удалены. Блок Using
делает это для нас.
Ссылки, ресурсы:
После добавления jar в путь сборки проектов вы можете импортировать классы специально, или вы можете импортировать пакеты класса Java. См. Следующие два примера.
Предположим, вы хотите использовать некоторые функции класса Scanner в своем классе. Затем вам нужно импортировать класс Scanner в свой класс (помните, что в том же пакете есть класс других классов в классе Scanner).
Чтобы импортировать класс сканера специально из пакета util, вы можете использовать следующие синтаксис.
import java.util.Scanner;
Это импортирует только класс Scanner из пакета util и позволяет использовать функции класса Scanner.
Чтобы импортировать все классы в пакете util, вы можете используйте следующий синтаксис
import java.util.*;
Это приведет к импорту всех классов в пакете util, и вам будет разрешено использовать любую функциональность из любого класса вашего класса (а не только из класса Scanner).
Второй метод называется wildcard import
. Разница в производительности между конкретным импортом и декларацией импорта подстановочного знака.
Вы не можете импортировать файл .jar.
Для этого вам нужно добавить его в путь к классам при компиляции и запуске, например
java -cp myJar.jar a.b.myMainClass
или
javac -cp myJar.jar a/*
Как только jar находится на пути класса выполнения, вы импортируете их в обычном режиме:
import the.package.and.name.of.TheClass;
Это связано с тем, что виртуальная машина Java имеет концепцию «пути к классу». Этот путь класса заполняется всеми файлами (классами и ресурсами), найденными в файлах jar и папках, размещенных в пути к классам.
Например, если у вас две jar и одна папка:
A.jar
com/
mycompany/
A.class
Another.class
B.jar
com/
mycompany/
B.class
neededImage.gif
bin-folder/
org/
apache/
Something.class
Из JVM POV у вас есть сумма всех этих папок, как если бы они были в одной папке.
Таким образом, вы можете свободно импортировать любой класс, который вам нужен, указав полное имя, независимо, если он находится внутри банки или в папке bin проекта.
На самом деле банки - это не более чем zip-файлы из папок, содержащие скомпилированные классы (и, в конечном итоге, другие ресурсы).
Класс путь объявляется JVM при запуске программы, используя ключ командной строки «-cp». Например, для предыдущих двух банок и одной папки в окнах вы должны были бы написать:
java -cp A.jar;B.jar;bin-folder your.main.class.Here
Вы импортируете классы, а не файлы jar, в исходный код Java.
Допустим, что у вас есть someJar.jar
, который содержит определения классов для 3 классов, FirstClass.class
, SecondClass.class
и ThirdClass.class
, все из которых находятся в пакете org.somepackage
.
Учитывая вышеизложенное, вы должны добавить
import org.somepackage.FirstClass
в начало исходного файла, чтобы импортировать класс с именем FirstClass
.