我的情况非常奇怪。我正在运行一个在Tomcat上返回图像的servlet。
我正在尝试运行此代码: FabricaControladores fabrica = FabricaControladores.getInstance();
String nombreProveedor = request.getParameter("nombre");
IVerInformacionDeProveedor infoProveedor = fabrica.getIVerInformacionDeProveedor();
infoProveedor.SeleccionarProveedor(nombreProveedor);
DataProveedor data = infoProveedor.VerInformacionProveedor();
image = data.getImagen();
BufferedImage bImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bImage.createGraphics();
graphics.drawImage(image,0,0,null);
graphics.dispose();
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream();
ImageIO.write(bImage, "jpeg", out);
out.close();
当我运行它时,我收到此错误:
HTTP Status 500 - Width (-1) and height (-1) cannot be <= 0
type Exception report
message Width (-1) and height (-1) cannot be <= 0
description The server encountered an internal error that prevented it from fulfilling this request.
exception
java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0
java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
java.awt.image.BufferedImage.<init>(BufferedImage.java:331)
MostrarImagen.doGet(MostrarImagen.java:110)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.42 logs.
Apache Tomcat/7.0.42
非常奇怪的是,使用非常类似的方法在SWING应用程序中获取图像时,它可以正常工作。
当我使用:
直接加载图像时 new ImageIcon(getClass().getResource("/Imagens/TC.jpg")).getImage())
它完美地展示了它。
就像图像在某处丢失或损坏一样。有什么想法吗?
修改
DATA PROVEEDOR
public class DataProveedor{
private String _nickname, _nombreCompania, _nombre, _apellido, _correo, _paginaWeb;
Image _imagen;
private Date _fechaNacimiento;
private Hashtable<Integer,DataProducto> _productos;
public DataProveedor(String nickname, String nombreCompania,
String nombre, String apellido, String correo,
String paginaWeb, Date fechaNacimiento,
Hashtable<Integer, DataProducto> productos) {
this._nickname = nickname;
this._nombreCompania = nombreCompania;
this._nombre = nombre;
this._apellido = apellido;
this._correo = correo;
this._imagen = null;
this._paginaWeb = paginaWeb;
this._fechaNacimiento = fechaNacimiento;
this._productos = productos;
}
public DataProveedor(String nickname,String nombreCompania,
String nombre, String apellido, String correo,
String paginaWeb, Date fechaNacimiento,
Hashtable<Integer, DataProducto> productos, Image imagen) {
this._nickname = nickname;
this._nombreCompania = nombreCompania;
this._nombre = nombre;
this._apellido = apellido;
this._correo = correo;
this._imagen = imagen;
this._paginaWeb = paginaWeb;
this._fechaNacimiento = fechaNacimiento;
this._productos = productos;
}
public String getNickname() {
return _nickname;
}
public String getNombreCompania() {
return _nombreCompania;
}
public String getNombre() {
return _nombre;
}
public String getApellido() {
return _apellido;
}
public String getCorreo() {
return _correo;
}
public Image getImagen() {
return _imagen;
}
public String getPaginaWeb() {
return _paginaWeb;
}
public Date getFechaNacimiento() {
return _fechaNacimiento;
}
public Hashtable<Integer, DataProducto> getProductos() {
return _productos;
}
** VER INFO **
@Override
public DataProveedor VerInformacionProveedor() {
return _proveedor.GetDataProveedor();
}
** GetDataProveedor **
public DataProveedor GetDataProveedor()
{
Hashtable<Integer, DataProducto>productos = new Hashtable<Integer, DataProducto>();
for(Producto p : _productos.values())
{
DataProducto ip = p.GetInfo();
productos.put(new Integer(ip.get_id()), ip);
}
DataProveedor dp;
if(this._imagen == null)
dp = new DataProveedor(GetNickname(),GetNombreCompania(),GetNombre(),GetApellido(),
GetCorreo(),GetPaginaWeb(),GetFechaNacimiento(),productos);
else
dp = new DataProveedor(GetNickname(),GetNombreCompania(),GetNombre(),GetApellido(),GetCorreo(),
GetPaginaWeb(),GetFechaNacimiento(),productos,this._imagen.getImagen());
return dp;
}
** DataProveedor **
public DataProveedor(String nickname, String nombreCompania,
String nombre, String apellido, String correo,
String paginaWeb, Date fechaNacimiento,
Hashtable<Integer, DataProducto> productos) {
this._nickname = nickname;
this._nombreCompania = nombreCompania;
this._nombre = nombre;
this._apellido = apellido;
this._correo = correo;
this._imagen = null;
this._paginaWeb = paginaWeb;
this._fechaNacimiento = fechaNacimiento;
this._productos = productos;
}
public DataProveedor(String nickname,String nombreCompania,
String nombre, String apellido, String correo,
String paginaWeb, Date fechaNacimiento,
Hashtable<Integer, DataProducto> productos, Image imagen) {
this._nickname = nickname;
this._nombreCompania = nombreCompania;
this._nombre = nombre;
this._apellido = apellido;
this._correo = correo;
this._imagen = imagen;
this._paginaWeb = paginaWeb;
this._fechaNacimiento = fechaNacimiento;
this._productos = productos;
}
答案 0 :(得分:1)
包含
的行new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
失败,因为image.getWidth(null)
和image.getHeight(null)
中的一个或两个都返回-1
。
我不确切知道image
的来源,但它似乎是java.awt.Image
的一个实例。这些映像是异步的,用于Applet或其他GUI应用程序。您遇到的问题是因为图像的异步加载尚未发生,并且图像的尺寸仍然未知。
代码使用image = new ImageIcon(...).getImage()
的原因是因为ImageIcon
构造函数具有确保图像在返回之前完全加载的代码。
对于服务器端应用程序,使用BufferedImage
可以让自己的生活更轻松。您可以使用BufferedImage
阅读ImageIO.read(...)
。