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内容的字节的精确序列。嗨,你能详细介绍一下第一种方法吗?