AWT DataBuffer in DataBufferInt Exception

  • Themenstarter Themenstarter Klaus_laust
  • Beginndatum Beginndatum
K

Klaus_laust

Gast
Hallo Zusammen,

ich beschäftige mich seit kurzem mit Bildverarbeitung in Java und bin jetzt an dem Punkt, wo ich die Pixel eines Bildes einlesen möchte.

Im Forum habe ich auch einige gute Quellen gefunden. Ich schaffe es leider nicht sie anzuwenden, weil ich eine Exception geworfen bekomme(Variante 1). Der Fehler ist zwar verständlicher Cast Problem, aber ich habe keine Idee, was man da tun müsste um ihn zu beheben.

In der Zeile 15 und 21 wird die Exception geworfen

Version 2-3 funktionieren, aber ich glaube das die erste Variante perfomanter ist. Kennt sich jemand damit aus?


Java:
	public void readImage(String url){
	
		File imageFile=new File(url);
		try {

			BufferedImage image=ImageIO.read(imageFile);
			
			if(image == null){
				System.out.println("Fehler beim Lesen");
			}
			String imageTitle = imageFile.getAbsolutePath();

			
			//Version1, die nicht funktioniert
			int[]pixels0 = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();
			for (int i : pixels0) {
				System.out.println(i);
			}
			
			//ausgelagerte Methode von Version1
			int [] pixels1= getDataArray(image);
			for (int i : pixels1) {
				System.out.println(i);
			}
			
			//Version 2(funktioniert)
			/*int[]array=null;
			int[]pixels = image.getRaster().getPixels(0, 0, image.getWidth(), image.getHeight(),array);
			*/
			
			//Version 3(funktioniert)
			/*ByteArrayOutputStream byar = new ByteArrayOutputStream();
			ImageIO.write(image, "jpg", byar);
			byte[] pixel3=byar.toByteArray();
			
			for (byte b : pixel3) {
				System.out.println(b);
			}*/
			
//	          System.out.println("ArrayLaenge "+ pixels.length);
//	          
//	          int i = image.getWidth() * image.getHeight();
//	          System.out.printf("\nBildgröße: " +i);
	          
	          
		} catch (IOException e) {
			System.out.println("Datei nicht gefunden");
		}
	
	}
	
	 private static int[] getDataArray(BufferedImage image)
	    {
	        Raster raster = image.getRaster();
	        DataBuffer dataBuffer = raster.getDataBuffer();
	        if (!(dataBuffer instanceof DataBufferInt))
	        {
	            throw new IllegalArgumentException(
	                "Image does not have a DataBufferInt");
	        }
	        DataBufferInt dataBufferInt = (DataBufferInt)dataBuffer;
	        int data[] = dataBufferInt.getData();
	        return data;
	    }
Java:
Exception in thread "main" java.lang.ClassCastException: java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt
	at model.ImageViewer.readImage(ImageViewer.java:67)
	at main.Main.main(Main.java:36)

Quellen:
http://www.java-forum.org/allgemeine-java-themen/39438-effizienteste-pixel-java-welt.html
http://www.java-forum.org/awt-swing-swt/123479-int-bufferedimage-konvertieren.html
 
Bei ImageIO.read weiß man erstmal nicht, welchen Typ das Bild hat, das man bekommt. Das hängt davon ab ob es ein JPG oder PNG ist, mit oder ohne Transparenz.... Das Bild, das du in diesem Fall bekommst, enthält offenbar keinen DataBufferInt, sondern einen DataBufferByte. Die einfachste Möglichkeit, sicherzustellen, dass es einen DataBufferInt hat, ist, das geladene Bild in ein Bild mit DataBufferInt reinzumalen - wie hier beschrieben: http://www.java-forum.org/spiele-mu...18-performance-bufferedimages.html#post803128
 

Neue Themen


Zurück
Oben