图像到bytearray到Blob和Blob到Bytearray,以图像Java中的转换问题



在大量学习之后Blobs,我设法编写了以下Java代码以将图像写入访问DB(使用UCanaccess)并将其写回磁盘。

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

我知道将图像存储在DB上不是一个好习惯,但这仅是我的学习。

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);
        } 
    }

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

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

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

否,我相信问题是您正在复制Writableraster的数据库,然后将其保存到.jpg文件中。当时不是JPEG - 它是WritableRaster使用的内部格式。

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

如果您需要做一些以不同格式或以不同尺寸的保存等等的事情,则应要求Imageio库将image 作为 a jpeg再次保存,请重新编码它...然后将结果存储为文件或数据库等。

使用FileInputStream而不是WritableRaster

读取图像文件

,然后使用PreparedStatementsetBinaryStream()方法将图像文件存储在数据库中..

它将将文件存储在字节中。

同样,从数据库中获取文件时,请使用getBytes()ResultSet方法并使用FileOutputStream

存储它
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");
    FileInputStream fin = new FileInputStream(ImgPath);
    String query = "INSERT INTO Images(Data) VALUES(?);";
    p = conn.prepareStatement(query);
    p.setBinaryStream(1, fin);
    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()) {
        byte[] bytearray = rs.getBytes("Data");
        FileOutputStream fos = new FileOutputStream("C:\Users\bharat.nanwani\Desktop\New Folder\test.jpg");
        fos.write(bytearray);
        fos.close();
        System.out.println(bytearray);
    }
}

它将解决您的问题。

以下是我要写入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();
}

最新更新