这个问题已经在这里有了答案 :
ImageIO.read在字节数组上返回null (1个答案)
6年前关闭。
我无法将我的Blob转换为缓冲图像,因此可以使用它。我从使用inputstream上传的数据库中得到了一个blob(jpg图像)。在我的数据库中,它存储为BufferedInputStream,我注意到了。我得到的Blob很好,它有一堆怪异的符号,并说它是jpg,所以图像必须很好。谁能发现我在做什么错?也许我将其转换为错误?在image
= ImageIO.read(new ByteArrayInputStream(data)); 图片返回null。
@GET
@Path("{id}")
@Produces("image/*")
public Response post(@PathParam("id") String id) throws IOException {
Connection con = connection();
Blob blob = getPhoto(con);
BufferedImage image = null;
byte[] data = null;
int blobLength = 0;
try {
blobLength = (int) blob.length();
data = blob.getBytes(1, blobLength);
image = ImageIO.read(new ByteArrayInputStream(data));
// ImageIO.write(image, "JPEG", new File("C:/Users/Nicolas/Desktop/image.jpg"));
} catch (SQLException e2) {
e2.printStackTrace();
}
return Response.ok(image).build();
}
我如何写入数据库
public void postPhoto(Connection con, InputStream uploadedInputStream){
String mySQL = "INSERT INTO photos (photo) values (?)";
PreparedStatement pStmt = con.prepareStatement(mySQL);
pStmt.setBlob(1, uploadedInputStream);
pStmt.execute();
}
我如何将文件发送到我的servlet
var fileInput = document.getElementById('file');
var file = fileInput.files[0];
var formData = new FormData();
formData.append("file", file);
var parameters="first="+firstName+"&last="+lastName+"&file="+file;
xmlhttp.open("post","http://localhost:8080/restService/api/submitinfo",true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(formData);
首先,先确认uploadedInputStream
是有效图像,然后再使用将其写出来ImageIO.write
。您始终可以使用ImageIO.read
读回的图像并将其写回到ByteArrayInputStream
;)
我使用H2数据库进行了快速测试。
我注意到了几件事。 Blob#length
返回long
,而Blob#getBytes
期望则返回int
,这可能意味着您正在截断字节流。
另外,从H2的文档来看,似乎Blob
内容没有保存在内存中,因此我改用了getBinaryStream
。
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
public class TestImageDatbase {
private Connection con;
public static void main(String[] args) {
new TestImageDatbase();
}
public TestImageDatbase() {
try {
clearDatabase();
saveImage();
loadImage();
} catch (ClassNotFoundException | SQLException | IOException exp) {
exp.printStackTrace();
}
}
protected Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.h2.Driver");
return DriverManager.getConnection("jdbc:h2:d:\\Image", "sa", "");
}
protected void clearDatabase() throws IOException, ClassNotFoundException, SQLException {
Connection con = null;
PreparedStatement stmt = null;
try {
con = getConnection();
System.out.println("Cleaning database");
stmt = con.prepareStatement("delete from images");
int updated = stmt.executeUpdate();
System.out.println("Updated " + updated + " rows");
} finally {
try {
stmt.close();
} catch (Exception e) {
}
try {
con.close();
} catch (Exception e) {
}
}
}
protected void saveImage() throws IOException, ClassNotFoundException, SQLException {
Connection con = null;
PreparedStatement stmt = null;
ByteArrayOutputStream baos = null;
ByteArrayInputStream bais = null;
try {
baos = new ByteArrayOutputStream();
File source = new File("/path/to/file");
System.out.println("Source size = " + source.length());
BufferedImage img = ImageIO.read(source);
ImageIO.write(img, "png", baos);
baos.close();
bais = new ByteArrayInputStream(baos.toByteArray());
con = getConnection();
stmt = con.prepareStatement("insert into images (image) values (?)");
stmt.setBinaryStream(1, bais);
int updated = stmt.executeUpdate();
System.out.println("Updated " + updated + " rows");
} finally {
try {
bais.close();
} catch (Exception e) {
}
try {
baos.close();
} catch (Exception e) {
}
try {
stmt.close();
} catch (Exception e) {
}
try {
con.close();
} catch (Exception e) {
}
}
}
protected void loadImage() throws IOException, ClassNotFoundException, SQLException {
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
con = getConnection();
stmt = con.prepareStatement("select image from images");
rs = stmt.executeQuery();
while (rs.next()) {
System.out.println("Getting blob");
Blob blob = rs.getBlob(1);
System.out.println("Reading image");
BufferedImage img = ImageIO.read(blob.getBinaryStream());
System.out.println("img = " + img);
JOptionPane.showMessageDialog(null, new JScrollPane(new JLabel(new ImageIcon(img))));
}
} finally {
try {
rs.close();
} catch (Exception e) {
}
try {
stmt.close();
} catch (Exception e) {
}
try {
con.close();
} catch (Exception e) {
}
}
}
}
问题内容: 有没有一种方法可以将JPanel(尚未显示)转换为BufferedImage? 谢谢, 杰夫 问题答案: 在BufferedImage中,您可以创建一个图形对象,可用于在JPanel上调用画图,如下所示: 您可能需要确保首先设置面板的尺寸。
我有一个UIExtView和一个UIImageView,我想把它们转换成一个单独的图像来共享。 SaveImageView是ImageView,我想在这里保存textview的图像。 Textview可以在屏幕上移动它,所以我决定保存它们的最终位置,并将其交给SaveImageView。 首先转换图像中的UItext View并保存他的位置。 然后,我想加入两个Imageview,成一个单一的图像
假设我有一个图像...有没有可能把它拆分成一个图像数组,每个按钮都有图像的一部分?我需要为每个按钮分配坐标,所以当图像的一个部分被按下时,我就会得到图像的那个部分的坐标
问题内容: 如何将灰度OpenCV图像转换为黑白图像?我看到已经提出了类似的问题,但是我使用的是OpenCV 2.3,建议的解决方案似乎不再起作用。 我正在尝试将灰度图像转换为黑白图像,以便不是绝对黑色的任何东西都是白色,并将其用作surf.detect()的蒙版,以便忽略在黑色蒙版区域边缘上找到的关键点。 下面的Python几乎可以解决我的问题,但是发送到Threshold()的阈值似乎没有任何
问题内容: 在StackOverflow上已经存在类似此链接的问题,并且可接受的答案是“广播”: 在我的程序中,我尝试: 不幸的是,我得到运行时错误: sun.awt.image.ToolkitImage无法转换为java.awt.image.BufferedImage 显然,投射不起作用。 问题是:将Image转换为BufferedImage的正确方法是(或存在)什么? 问题答案: 从Java游
问题内容: 有哪些实用程序可获取网页图像? 基本上等同于打开页面后对其进行“截屏”。 问题答案: wkhtmltopdf和wkhtmltoimage是开源(LGPLv3)命令行工具,可使用QT Webkit渲染引擎将HTML渲染为PDF和各种图像格式。