#java #mysql #blob #bufferedimage
#java #mysql #большой двоичный объект #bufferedimage
Вопрос:
Тогда я успешно управлял своей веб-камерой с помощью библиотеки захвата веб-камеры. Вот мой код :
public void capture() {
wc.setViewSize(WebcamResolution.QVGA.getSize());
WebcamPanel wp = new WebcamPanel(wc);
wp.setMirrored(true);
JPanel jp = new JPanel();
tp.setSize(jp.getWidth(), jp.getHeight());
tp.addTab("", wp);
tp.getParent().revalidate();
}
И так получилось, что я хочу сохранить полученное изображение в своей базе данных (mysql),
хорошо, что я смог его успешно сохранить.
С помощью этих кодов:
public void save() {
BufferedImage bi = wc.getImage();
try {
ByteArrayOutputStream bimg = new ByteArrayOutputStream();
ImageIO.write(bi, "JPG", bimg);
byte[] imgb = bimg.toByteArray();
try {
Blob bis = conn.createBlob();
bis.setBytes(1, imgb);
String query = "insert into tbl_img (imgid,clientimg) values ('" but.getText() "' , '" bis "')";
psmt = conn.prepareStatement(query);
psmt.executeUpdate();
JOptionPane.showMessageDialog(null, "Success", "Capture", JOptionPane.NO_OPTION);
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e);
}
}
Из BufferedImage я преобразовал его в ByteArray, чтобы он соответствовал флагу mysql Blob.
Вместо вставки данных я хочу получить их обратно в виде изображения и поместить в JLabel напрямую через JFrame. Скажем, не занимая места на жестком диске.
У меня есть код для извлечения изображения, но результат выглядит только как белый JFrame.
public void open() {
try {
stmt = conn.createStatement();
String quer = " select clientimg from tbl_img where imgid='" open.getText() "' ";
ResultSet rs = stmt.executeQuery(quer);
while (rs.next()) {
byte[] inbytes = rs.getBytes("clientimg");
Image img = Toolkit.getDefaultToolkit().createImage(inbytes);
ImageIcon ico = new ImageIcon(img);
JFrame jf = new JFrame("Viewer");
JLabel jl = new JLabel();
jl.setSize(ico.getIconWidth(), ico.getIconHeight());
jf.setSize(ico.getIconWidth(), ico.getIconHeight());
jl.setIcon(ico);
jf.add(jl);
jf.setVisible(true);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Есть ли другой способ или получение большого двоичного объекта обратно в изображение? если есть, не стесняйтесь изменять код для меня, чтобы сделать его понятнее. Я попробовал, я думаю, все возможные способы из Google.
Комментарии:
1. Я настоятельно рекомендую не делать что-то подобное. Храните такие файлы где-нибудь в папке, а не в базе данных.
2. почему я не могу сохранить изображение в базе данных? . Можете ли вы помочь мне с методом, который вы говорите?
3. На самом деле нет общего правила, для которого это лучший подход. Я работал над системой, в которой требовалось, чтобы все файлы (не только изображения, но также файлы PDF и doc) сохранялись в базе данных. Но помимо этого, вы пытались перенести восстановленные байты в файл для сравнения?
4. я этого не сделал. как я собираюсь это сделать?
5. Чтобы упростить тестирование, вы можете передать массив байтов методу save и использовать эту ссылку для сохранения байтов, сохраненных в базе данных. Затем передайте этот массив байтов методу open и сравните то, что пришло из базы данных, с тем, что у вас есть в памяти. Это только для конкретного теста, я не предлагаю постоянно менять сигнатуры методов.