Convert InputStream to file

java

(Ngoclong Pham) #1

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

(Trần Hoàn) #2

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é.


(Ngoclong Pham) #3

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à


(SITUVN.gcd) #4

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?


(Ngoclong Pham) #5

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


(Đào An) #6

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


(Ngoclong Pham) #7

Ả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


(Đào An) #8

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?