Java 如何将BuffereImage对象转换为InputStream或BLOB?

Java 如何将BuffereImage对象转换为InputStream或BLOB?,java,blob,inputstream,Java,Blob,Inputstream,我正在尝试使用LONGBLOB属性将用户上传的图像存储到数据库中。。。我遇到了一个PreparedStatement的问题,该语句有两种设置blob的方法,它们是: public void setBinaryStream(int参数索引,InputStream x) public void setBlob(int参数索引,Blob x) public void setBlob(int参数索引,InputStream InputStream) 现在的问题是我有一个BufferedImage对象,它

我正在尝试使用
LONGBLOB
属性将用户上传的图像存储到数据库中。。。我遇到了一个
PreparedStatement
的问题,该语句有两种设置blob的方法,它们是:

public void setBinaryStream(int参数索引,InputStream x)

public void setBlob(int参数索引,Blob x)

public void setBlob(int参数索引,InputStream InputStream)

现在的问题是我有一个
BufferedImage
对象,它必须转换成
Blob
InputStream
来上传

如何在不丢失原始图像格式或质量的情况下执行此操作

如何在不丢失原始图像格式或质量的情况下执行此操作?

您需要使用适当的(无损)格式保存它。这是一种选择

该类具有将图像写入输出流的方法

下面是一个完整的示例,说明如何获取
InputStream
,从中可以读取
BufferedImage
内容的PNG表示:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
InputStream is = new ByteArrayInputStream(baos.toByteArray());
下面是一个示例代码:

ByteArrayOutputStream bas = new ByteArrayOutputStream();
ImageIO.write(image,"jpg", bas);
byte[] bytes = bas.toByteArray();
InputStream is = new ByteArrayInputStream(bytes);

不要忘记将第二个ImageIO.write参数检查为所需的图像格式(例如“jpg”、“bmp”、“png”)。

写入函数以序列化/取消序列化缓冲区图像 从一个
字节[]
到另一个字节[],并使用类
ByteArrayInputStream
ByteArrayOutputStream

您可能需要序列化图像类型、宽度和高度 以及图像像素值(通过
buffereImage.getRGB(x,y)
获得)

另一种方法是调用
ImageIO.write(图像,“png”,扩展)
将图像转换为PNG格式并将其写入
ByteArrayOutputStream
。有一个等价的
ImageIO.read(inputStream)
方法从
ByteArrayInputStream
读取图像。 在转换为PNG或从PNG转换为PNG时会有一些处理开销。 但是PNG是一种压缩的图像格式,你会节省很多 与存储未压缩的图像相比,空间不足。

要创建Blob:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", baos);
Blob blFile = new javax.sql.rowset.serial.SerialBlob(baos.toByteArray());

感谢Csujo和@aioobe的快速回答…但在这两种情况下,我还必须管理图像的传入格式…如果没有格式转换,是否没有其他方法可以做同样的事情?您如何接收此“传入”图像?通过使用文件选择器选择图像,然后使用FileInputStream将原始字节数组与缓冲图像一起保存。就我所知,没有办法“恢复”曾经用于生成BuffereImage内容的字节的精确序列。嗨,你能详细介绍一下第一种方法吗?