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