经过大量的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);
}
}
答案 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
它会解决你的问题..