PNGs mit Java laden und ArrayOutOfBoundsException



  • speicher das bild auf platte und versuchs mal von da zu öffnen, wenn das geht, dann liegts warscheinlich an dem php zeugs



  • Das png auf der platte speichern und zu öffnen habe ich bereits gemacht.
    Das geht alles wunderbar.
    Ich hab jetzt als Test mal so ein Png hier hochgeladen.
    Wenn ich den link in die ImageIO.read(..) Funktion einsetzte erhalte ich genau die gleiche Fehlermeldung


  • Mod

    @boom: Dann versuch mal, nen kleinen Umweg zu gehen. Vielleicht klappt es ja über die Variante der Methode, die einen InputStream haben will. Schreib halt noch ein bischen Extracode, um an das Image über einen BufferedInputStream zu kommen.



  • Okay, vielen dank schonmal für die Hilfe.

    Ich habe nun mit dem HttpClient mir das bild als InputStream besorgt.
    Danach hab ich daraus ein BufferedImage gemacht und versucht zu speichern.

    [...]
    
    BufferedImage bi = ImageIO.read (is);
    
    ImageIO.write (bi, "png", new File ("bild.png"));
    

    Jetzt bekomme ich allerdings die Fehlermeldung:

    java.lang.IllegalArgumentException: im == null!
    	at javax.imageio.ImageIO.write(Unknown Source)
    	at javax.imageio.ImageIO.write(Unknown Source)
    	at web.Web.getPng(Web.java:299)
    	at main.Main.main(Main.java:17)
    Exception in thread "main"
    

    Könnte es daran leigen, dass das Bild nicht gerendert ist?

    Denn laut der java dokumentation erwartet die ImageIO.write(...) Funktion ein RenderedImage:

    public static boolean write(RenderedImage im,
                                String formatName,
                                File output)
    


  • @boom: Guck mal, ob bi null ist.



  • Das ist viellciht komisch... Ich geb dir mal den code:

    HttpClient httpclient = new HttpClient();
    
    			HttpMethod httpmethod = new GetMethod ("http://painpleasure.extra.hu/upload/test.png");
    
    			httpmethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
    
    			InputStream is = null;
    
    		    try {
    		        // Execute the method.
    		        int statusCode = httpclient.executeMethod(httpmethod);
    
    		        if (statusCode != HttpStatus.SC_OK) {
    		          System.err.println("Method failed: " + httpmethod.getStatusLine());
    		        }
    
    		        // Read the response body.
    		        is = httpmethod.getResponseBodyAsStream();
    
                            //provisorische Lösung zum Auslesen eines teils des pngs
    		        byte part[] = new byte [100];
    
    		        is.read(part);
    
    		        String sPart = new String (part);
    
    		        System.out.println ("in try!");
    		        System.out.println ("Bytes:" + sPart);
    
    		      } catch (HttpException e) {
    		        System.err.println("Fatal protocol violation: " + e.getMessage());
    		        e.printStackTrace();
    		      } catch (IOException e) {
    		        System.err.println("Fatal transport error: " + e.getMessage());
    		        e.printStackTrace();
    		      } finally {
    		        // Release the connection.
    		        httpmethod.releaseConnection();
    		      }
    
    		      ////////////////////////////////////////////////
    
    		      BufferedImage bi = ImageIO.read (is);
    
    		      if (bi == null)
    		    	  System.out.println("bi = null!");
    
    	  		ImageIO.write (bi, "png", new File ("bild.png"));
    

    Und wenn ich das jetzt ausführe, dann wird zwar ein teil des pngs ausgelesen (es sind zwar jede menge kästchen und anderes wirres zeug, aber es ist nicht nichts 😉 ). Allerdings unten geht mein Programm TROTZDEM noch in den System.out.println("bi = null!")-Block rein.

    Das heisst im try-Block ist der Stream anscheinend noch nicht null, aber ausserhalb des try-Blocks anscheinend schon... 😕 😕



  • @boom: Auf jeden Fall solltest Du erstmal einen BufferedInputStream um Deinen InputStream herumbauen.



  • Und wie mach ich das genau?

    ich hab gerade versucht, den InputStream einfach in einen BufferedInputStream zu konvertieren und diesen BufferedInputStream dann an die write-Funktion zu übergeben. Die Fehlermeldung bleibt die gleiche...


  • Mod

    Ich hatte an sowas gedacht:

    is = new BufferedInputStream(httpmethod.getResponseBodyAsStream());

    Sag mal, kommentierst Du das "is.read(part);" eigentlich aus, wenn Du den Test für das richtige Bild machst?



  • okay, genau so hab ich das jetzt auch gemacht.

    HttpClient httpclient = new HttpClient();
    
    			HttpMethod httpmethod = new GetMethod ("http://painpleasure.extra.hu/upload/test.png");
    
    			httpmethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
    
    			InputStream is = null;
    
    		    try {
    		        // Execute the method.
    		        int statusCode = httpclient.executeMethod(httpmethod);
    
    		        if (statusCode != HttpStatus.SC_OK) {
    		          System.err.println("Method failed: " + httpmethod.getStatusLine());
    		        }
    
    		        // Read the response body.
    		        is = httpmethod.getResponseBodyAsStream();
    
    		      } catch (HttpException e) {
    		        System.err.println("Fatal protocol violation: " + e.getMessage());
    		        e.printStackTrace();
    		      } catch (IOException e) {
    		        System.err.println("Fatal transport error: " + e.getMessage());
    		        e.printStackTrace();
    		      } finally {
    		        // Release the connection.
    		        httpmethod.releaseConnection();
    		      }
    
    		      ////////////////////////////////////////////////
    
    		      BufferedInputStream binputstream = new BufferedInputStream (is);
    
    		      BufferedImage bi = ImageIO.read (binputstream);
    
    		      if (binputstream == null)
    		    	  System.out.println("BufferedInputStream ist Null!");
    		      if (bi == null)
    		    	  System.out.println ("BufferedImage ist Null!");
    
    	  		try {
    	  			ImageIO.write (bi, "png", new File ("bild.png"));
    	  		}
    	  		catch (IllegalArgumentException e) {
    	  			e.printStackTrace();
    	  		}
    
    	  	}
    	  	catch (IOException e) {
    	  		e.printStackTrace();
    	  	}
    

    Aber es geht immer noch nicht...

    Das is.read(part) habe ich auskommentiert.


Anmelden zum Antworten