Convert InputStream to file

Trong db của mình có bảng image chỉ có 2 trường id và data_img,
mình read inputstream sau đó copy ảnh đó ra 1 file khác nhưng chất lượng hình ảnh tệ quá, làm sao để giữ nguyên chất lượng hình ảnh nhỉ. Đây là example của mình

EDIT: ảnh trong db mình cũng lưu dưới dạng inputStream kiểu dữ liệu blob, khi copy qua thì kích thước ảnh không đổi chỉ chất lượng thì giảm đi thôi.

    public class CopyImageTest {

    	public static void main(String[] args) throws SQLException, IOException {
    		CopyImageTest imageTest = new CopyImageTest();
    		imageTest.insertImage();
    	}

    	public Connection getConnection() {
    		Connection connection = null;

    		try {
    			connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "longpn", "xxxxx");
    		} catch (Exception e) {
    			System.out.println("Error Occured While Getting the Connection: - " + e);
    		}
    		return connection;
    	}

    	public void insertImage() throws IOException {
    		Connection connection = null;
    		PreparedStatement statement = null;
    		try {

    			connection = getConnection();

    			statement = connection.prepareStatement("select data_img from image");

    			ResultSet rs = statement.executeQuery();
    			while (rs.next()) {
    				InputStream stream = rs.getBinaryStream("data_img");

    				copyInputStreamToFile(stream, new File("D:\\a.png"));

    			}
    		} catch (FileNotFoundException e) {
    			System.out.println("FileNotFoundException: - " + e);
    		} catch (SQLException e) {
    			System.out.println("SQLException: - " + e);
    		} finally {

    			try {
    				connection.close();
    				statement.close();
    			} catch (SQLException e) {
    				System.out.println("SQLException Finally: - " + e);
    			}
    		}
    	}

    	private static void copyInputStreamToFile(InputStream inputStream, File file) throws IOException {

    		try (FileOutputStream outputStream = new FileOutputStream(file)) {

    			int read;
    			byte[] bytes = new byte[1024];

    			while ((read = inputStream.read(bytes)) != -1) {
    				outputStream.write(bytes, 0, read);
    			}
    		}
    	}
    }

Chưa rõ tại sao chất lượng ảnh lại có thể giảm nhưng bạn cứ close outputStream lại sau khi write xong nhé.

dùng try resources nó tự động close resource dù thành công hay thất bại nên mình không cần care nó đâu, java 7 nó đã thêm cái này rồi mà

1 Like

Không có chuyện hình ảnh tự giảm chất lượng đâu.
Nếu dữ liệu có thay đổi thì chẳng còn xem được hình luôn ấy chứ.

Nhưng mình thắc mắc là quá trình lưu hình vào CSDL bạn lưu bằng cách nào? Quá trình này có phải chính là quá trình làm giảm chất lượng ảnh không?

3 Likes

Thì tớ đọc file ra inputstream thôi. Rồi lưu nó vào db. Kích thước hình ảnh nó vẫn giữ nguyên là 8 kb. Chỉ có mở lên thì mờ tịt

Ảnh gì 8kb thì chả mờ :slight_smile:, bạn sài ImageView show ảnh từ file và từ db để so sánh xem.

2 Likes

Ảnh cũ không mờ mà. Tớ chưa lưu ảnh vào db bao giờ. Trước toàn lưu mỗi url thôi, còn ảnh lưu trong source luôn

Mờ như thế nào bạn show lên đây xem

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?