图像到ByteArray到BLOB和BLOB到ByteArray到Java中的图像转换问题

时间:2015-05-18 10:55:42

标签: java image bytearray blob ucanaccess

经过大量的ByteArrays& amp; BLOBS,我设法编写下面的Java代码,将图像写入Access DB(使用ucanaccess)并将其写回磁盘。

当我将图像写回磁盘时,图像格式不正确或者有些东西搞砸了,无法打开该图像。

我知道将图像存储在数据库上不是一个好习惯,但这只是为了我的学习。

public static void Update_to_DB() throws SQLException, IOException {
    String URL = "jdbc:ucanaccess://C:\\Users\\bharat.nanwani\\Desktop\\Images.accdb";
    Connection conn = DriverManager.getConnection(URL);
    //Statement stmt = conn.createStatement();
    PreparedStatement p;

    File ImgPath = new File("C:\\Users\\bharat.nanwani\\Desktop\\Desert.jpg");
    BufferedImage bufferedimage = ImageIO.read(ImgPath);

    WritableRaster raster = bufferedimage.getRaster();
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer();

    byte[] bytearray = date.getdata();


    String query = "INSERT INTO Images(data) VALUES(?);";
    p = conn.prepareStatement(query);
    p.setBinaryStream(1, new ByteArrayInputStream(bytearray),bytearray.length);
    p.execute();
}

public static void update_to_DISK() throws SQLException, IOException {
        String URL = "jdbc:ucanaccess://C:\\Users\\bharat.nanwani\\Desktop\\Images.accdb";
        Connection conn = DriverManager.getConnection(URL);
        PreparedStatement p;
        ResultSet rs;
        String query = "SELECT Data FROM Images";
                p=conn.prepareStatement(query);
        rs = p.executeQuery();
        if (rs.next()) {
        Blob blob = rs.getBlob("Data");

        byte[] bytearray = blob.getBytes(1L, (int)blob.length());

        FileOutputStream fos = new FileOutputStream("C:\\Users\\bharat.nanwani\\Desktop\\New Folder\\test.jpg");
        fos.write(bytearray);
        fos.close();

        System.out.println(bytearray);
        } 
    }

3 个答案:

答案 0 :(得分:1)

首先,您应该将其分为两部分:

  • 将二进制数据存储在数据库中并检索它
  • 加载图像文件并再次保存

没有必要使用数据库来测试第二部分 - 您应该通过加载图像并直接保存到文件,跳过数据库来诊断问题。

不,我认为问题在于您从WritableRaster的数据缓冲区复制数据,然后将其保存到.jpg文件。在那一点上它不是jpeg - 它是WritableRaster使用的内部格式。

如果你想要一个jpeg文件,你根本不需要使用ImageIO - 因为你已经使用jpeg文件启动了。如果要以相同的图像开始和结束,只需复制文件(或者根据您的情况将文件保存到数据库中)。那只是将文件视为字节。

如果你需要做一些事情,比如以不同的格式或不同的大小保存等,那么你应该让ImageIO库再次将图像保存为一个JPEG,重新编码它...然后将结果存储为文件或数据库等。

答案 1 :(得分:0)

以下是我写给DB的所作所为 -

public static void main(String[] Args) throws SQLException, IOException {
    String URL = "jdbc:ucanaccess://C:\\Users\\bharat.nanwani\\Desktop\\Images.accdb";
    Connection conn = DriverManager.getConnection(URL);
    PreparedStatement p;

    File ImgPath = new File("C:\\Users\\bharat.nanwani\\Desktop\\Desert.jpg");
    FileInputStream fileinput = new FileInputStream(ImgPath); 

    byte[] bytearray = new byte[(int)ImgPath.length()];


    String query = "INSERT INTO Images(data) VALUES(?);";
    p = conn.prepareStatement(query);
    //p.setBinaryStream(1, new ByteArrayInputStream(bytearray),bytearray.length);
    p.setBytes(1, bytearray);
    p.execute();
}

答案 2 :(得分:-1)

使用FileInputStream而非WritableRaster

阅读图片文件

然后使用setBinaryStream()的<{1}}方法将图像文件存储在数据库中。

它将以字节存储文件。

同时从数据库获取文件时使用PreparedStatement的{​​{1}}方法并使用getBytes()

存储它
ResultSet

它会解决你的问题..