我正在尝试将用户上传的图像存储到具有LONGBLOB
属性的数据库中...我遇到了PreparedStatement
的问题,该问题有两种设置blob的方法:
public void setBinaryStream(int parameterIndex, InputStream x)
public void setBlob(int parameterIndex, Blob x)
public void setBlob(int parameterIndex, InputStream inputStream)
现在问题是我有一个BufferedImage
对象,必须转换为Blob
或InputStream
才能上传...
如何在不丢失原始图像格式或质量的情况下执行此操作?
答案 0 :(得分:28)
如何在不丢失原始图像格式或质量的情况下执行此操作?
您需要使用一些适当的(无损)格式保存它。 png format是一种选择。
ImageIO
类具有将图像写出到输出流的方法。
以下是您如何掌握InputStream
的完整示例,您可以从中阅读BufferedImage
内容的PNG表示:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
InputStream is = new ByteArrayInputStream(baos.toByteArray());
答案 1 :(得分:3)
以下是示例代码:
ByteArrayOutputStream bas = new ByteArrayOutputStream();
ImageIO.write(image,"jpg", bas);
byte[] bytes = bas.toByteArray();
InputStream is = new ByteArrayInputStream(bytes);
不要忘记将第二个ImageIO.write参数检查为所需的图像格式(例如“jpg”,“bmp”,“png”)。
答案 2 :(得分:1)
编写函数来序列化/反序列化BufferedImage
来自byte []
并使用类ByteArrayInputStream
和
ByteArrayOutputStream
。
您可能需要序列化图像类型,宽度和高度
和图像像素值(用BufferedImage.getRGB(x, y)
获得)。
另一种方法是致电ImageIO.write(image, "png", outStream)
将图像转换为PNG格式并将其写入
ByteArrayOutputStream
。相当于ImageIO.read(inputStream)
从ByteArrayInputStream
读取图像的方法。
转换到/来自PNG有一些处理开销。
但PNG是一种压缩的图像格式,你会节省很多
与存储未压缩图像的空间相比。
答案 3 :(得分:0)
创建Blob:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
Blob blFile = new javax.sql.rowset.serial.SerialBlob(baos.toByteArray());