java.awt.Image khá đơn giản. Nó không cung cấp bất kỳ phương tiện nào để hình ảnh có thể được ghi / lưu cũng như không cung cấp bất kỳ phương tiện nào để có quyền truy cập vào dữ liệu pixel cơ bản của hình ảnh.
Bước đầu tiên, là chuyển đổi java.awt.Image đến thứ gì đó ImageIO có thể hỗ trợ. Điều này sẽ cho phép bạn ghi dữ liệu hình ảnh ra ngoài ...
ImageIO yêu cầu RenderedImage vì nó là nguồn hình ảnh chính. BufferedImage là cách triển khai duy nhất của giao diện này trong các thư viện mặc định ...
Thật không may, không có phương pháp đơn giản để chuyển đổi từ cái này sang cái kia. May mắn thay, nó không khó.
Image img = ...;
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
g2d.drawImage(img, 0, 0, null);
g2d.dispose();
Về cơ bản, điều này chỉ vẽ java.awt.Image ban đầu vào BufferedImage
Tiếp theo, chúng ta cần lưu hình ảnh theo một cách nào đó để nó có thể tạo ra một InputStream ...
Điều này ít hơn một chút so với tối ưu, nhưng sẽ hoàn thành công việc.
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
ImageIO.write(bi, "png", baos);
} finally {
try {
baos.close();
} catch (Exception e) {
}
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
Về cơ bản, chúng tôi ghi hình ảnh ra ByteArrayOutputStream và sử dụng kết quả để tạo ByteArrayInputStream
Hiện nay. Nếu bộ nhớ có vấn đề hoặc hình ảnh khá lớn, trước tiên bạn có thể ghi hình ảnh vào File và sau đó chỉ cần đọc File quay lại thông qua một số loại InputStream thay vào đó ...
Cuối cùng, chúng tôi đặt InputStream vào cột bắt buộc ...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
Và Blob là chú của bạn ...