从Mysql DB读取图像并再次将其重新发送到Java中的DB

时间:2015-01-08 07:03:19

标签: java mysql image swing blob

我再次向数据库写入图像有问题!这就是我做的! 用户通过Jframe从硬盘中选择图像,我读取图像的内容然后将其发送到数据库,这里我没有任何问题! 用户再次打开Jframe编辑其他内容时的问题!我知道如果你没有看到整个代码,它可能含糊不清!我知道如何读取文件然后将其编码为十六进制代码以将其发送到数据库 - mysql中的blob数据类型 - 这是关于读取图像并将其转换为十六进制代码的代码:这完美无缺,我没有任何问题

 private String makeBlob(String paths) {
    char[] hexArray = "0123456789abcdef".toCharArray();
    Path path = Paths.get(paths);

    byte[] bytes = null;
    try {
        bytes = Files.readAllBytes(path);
    } catch (IOException ex) {
        Logger.getLogger(LuggageAdd.class.getName()).log(Level.SEVERE, null, ex);
    }

    char[] hexChars = new char[bytes.length * 2];

    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    String test = new String(hexChars);
    return "0x" + test;
}

注意:我的jFrame上使用jLabel显示图像!所以它是imageIcon

是否有办法对现有的图像对象做同样的事情!我的意思是,在上面我从文件生成十六进制代码(PATH TO AN IMAGE),但我想从现有的imageIcon对象生成十六进制代码?如果我能做到这一点,如果图像尚未编辑,将很容易再次将图像重新发送到数据库!

以下是我从数据库中获取图像的方法:

   public ImageIcon getImage(int id) {
    BufferedImage bufferedImage = null;
    try {
        String ss = "SELECT image FROM  luggage WHERE ID = " + id + " ";
        ResultSet result = this.databaseConnection.doQuery(ss);

        while (result.next()) {
            Blob blob = result.getBlob("image");

            int blobLength = (int) blob.length();

            byte[] blobAsBytes = blob.getBytes(1, blobLength);
            bufferedImage = ImageIO.read(new ByteArrayInputStream(blobAsBytes));
        }
    } catch (Exception ex) {
        ex.printStackTrace();   }

    return new ImageIcon(bufferedImage.getScaledInstance(128, 128, Image.SCALE_SMOOTH));
}
PS:我已经尝试了另一种解决方案,我读取了图像并暂时将其写入硬盘然后再将其重写到数据库,但是当我将其保存到数据库时图像大小增加的问题磁盘!如果原始图片大小 1.9MB ,那么它将 2.40MB 。这样效率不高,因为我希望以相同的质量和尺寸重新保存我的图像,除此之外我还有图片大小的限制。

因此解决问题的唯一方法就是知道如何获取图像图标的内容并将其重新发送到数据库!

谢谢:)

1 个答案:

答案 0 :(得分:1)

您可以将图像blob(blobAsBytes)引用存储为图像源。

或者

使用ImageIcon的方法getImage()并将图像转换为字节。

E.g。

try {
    // retrieve image
    BufferedImage bi = getMyImage();
    File outputfile = new File("saved.png");
    ImageIO.write(bi, "png", outputfile);
} catch (IOException e) {
    ...
}

或不保存到文件,而是保存到ByteArrayOutputStream。

但对我来说第一种方式更好,因为ImageIcon保留了scled实例而不是原始图像。