0

我处于一个非常奇怪的境地。我正在运行一个在 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())

它完美地展示了它。

就像图像在某处丢失或损坏。有任何想法吗?

编辑

数据提供者

  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;
}

** 版本信息 **

    @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;
    }
4

1 回答 1

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(...).

于 2013-09-16T08:38:43.807 回答