WritableRaster in ein Array wandeln

  • Themenstarter Themenstarter Gabriell
  • Beginndatum Beginndatum
G

Gabriell

Gast
Hallo,

ich möchte gern den WritableRaster in ein array speichern. In der Java Doku wird das angeboten:
Java:
int[] 	getSamples(int x, int y, int w, int h, int b, int[] iArray)
Returns the samples for a specified band for the specified rectangle of pixels in an int array, one sample per array element.

[JAPI]http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/Raster.html[/JAPI]

Da WritableRaster von Raster erbt, müsste die Methode auch für WritableRaster gelten.
Java:
Raster raster=img.getRaster();
WritableRaster outputraster=raster.createCompatibleWritableRaster();
.
//arbeiten mit dem Raster
.
int[] outputarray = outputraster.getSamples(0, 0, width, height, 0, null);

In der Zeile 6 gibt mir der LiveCompiler die Meldung:
The method getSamples(int, int, int, int, int, int[]) is ambiguous for the type WritableRaster

Das hatte ich auch schon versucht! Vergebens...

Java:
int[] test= new int[width*height];
outputraster.setSamples(0, 0, width, height, 0, test);

hilfe, 🙂
 
Danke erstmals,

ich bekomme das irgendwie nicht hin. Deinen Vorschlag habe ich versucht und bei getData() gibt es einen Fehler.
Java:
int[] data = outputImage.getRaster().getDataBuffer().getData();
int[] data2= outputraster.getDataBuffer().getData();
getData() von der Klasse BufferedImage gibt ein Raster zurück und kein Array. Der Comiler spuckt den Fehler.
The method getData() is undefined for the type DataBuffer

Ich möchte jetzt ungern den Raster in ein BufferdImage setzten und dann erst in ein Array.
Ich erhalte einen Raster(von einem Graustufen Bild), bearbeite die Samples und gebe diese in einem Array zurück. Warum funktioniert denn das nicht mit getSamples() aus der der Doku? Kann mir jemand erklären, wo mein Denkfehler ist?
 
Das hatte ich auch schon versucht! Vergebens...

Java:
int[] test= new int[width*height];
outputraster.setSamples(0, 0, width, height, 0, test);

Was heißt vergebens? Der "ambiguous"-Fehler kommt ja, weil das letzte Argument entscheidet, welche [c]getSamples[/c] aufgerufen wird. Wenn Du [c]null[/c] übergibst, musst Du das von Hand auf [c]double[][/c], [c]float[][/c] oder [c]int[][/c] casten. Oder Du übergibst ein entsprechendes Array, wie Du es ja auch gemacht hast.
 
int[] data = outputImage.getRaster().getDataBuffer().getData();
ändern in
Java:
DataBufferInt d = (DataBufferInt)outputImage.getRaster().getDataBuffer();
int[] data = d.getData();
Falls das BufferedImage kein TYPE_INT ist, krachts da, dann mehr code posten oder genauer sagen, was du vorhast.
 
Ich verstehe die setSamples() Methode so:

Ich übergebe der Methode ein Array und die Methode knallt alle Samples in das übergebene Array(letztes Argument).

Wenn ich jedoch die Liste ausgebe, sind alle Werte mit 0 gefüllt und nicht mit den Sample Werten.

Java:
int[] outputarray= new int[width*height];
outputraster.setSamples(0, 0, width, height, 0, outputarray);
System.out.println("Länge: "+test2.length);
		
		for (int i : outputarray) {
			System.out.println(i);
		}
 
Falls das BufferedImage kein TYPE_INT ist, krachts da, dann mehr code posten oder genauer sagen, was du vorhast.
Ist ein TYPE_BYTE_GRAY.

Java:
private int[] executeThreshold(BufferedImage input, int threshold) {

		if(threshold<0 || threshold>255){
			System.out.println("Unerlaubte eingabe: ExceptionHandling");
		}
		int width=input.getWidth();
		int height=input.getHeight();
		
		Raster raster=input.getRaster();
		WritableRaster outputraster=raster.createCompatibleWritableRaster();
		
		for(int x=1;x<=width-1;x++){
			for(int y=1;y<=height-1;y++){
				
				int value=raster.getSample(x, y, 0);
				
				if(value <= threshold){
					outputraster.setSample(x, y, 0, 0);
				}
			}
		}
		//Bild ist nach Threshold richtg. Nur für das Anzeigen, ob alles korrekt
		BufferedImage outputImage=new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
		outputImage.setData(outputraster);
		
		//Raster in Array
		int[] outputarray= new int[width*height];
		outputraster.setSamples(0, 0, width, height, 0, outputarray);
		System.out.println("Länge: "+outputarray.length);
		
		for (int i : outputarray) {
			System.out.println(i);
		}
		
		//int[] outputarray = outputraster.getSamples(0, 0, width, height, 0, null);
		
		return outputarray;
	}

Zum Code: Eine einfache Methode für eine Schwelle an Grauwertbilder. Die neuen Werte, nach der Operation, sollen als int[] zurückgegeben werden.

Marco13 Wieso eigentlich set und nicht get?
Zu Anfang habe ich es mit get versucht. Ich habe es nicht hinbekommen. Siehe ersten Beitrag
 
Ja, beschreib' mal was du vorhast. Also nicht "Ich will von einem WriteableRaster Samples holen..." sondern "Ich will ...[irgendwas mit einem Schwellwert machen]"

Java:
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class RasterTest {
	
	
	public static void main(String[] args) throws IOException {
        BufferedImage image = ImageIO.read(new File("image00.png"));
        BufferedImage inputImage=new BufferedImage(image.getWidth(), image.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
        Graphics2D g = inputImage.createGraphics();
        g.drawImage(image, 0, 0, null);
        g.dispose();
        executeThreshold(inputImage, 64);
	}

	private static int[] executeThreshold(BufferedImage input, int threshold) {
		 
        if(threshold<0 || threshold>255){
            System.out.println("Unerlaubte eingabe: ExceptionHandling");
        }
        int width=input.getWidth();
        int height=input.getHeight();
        
        Raster raster=input.getRaster();
        WritableRaster outputraster=raster.createCompatibleWritableRaster();
        
        for(int x=1;x<=width-1;x++){
            for(int y=1;y<=height-1;y++){
                
                int value=raster.getSample(x, y, 0);
                
                if(value <= threshold){
                    outputraster.setSample(x, y, 0, 255);
                }
            }
        }
        //Bild ist nach Threshold richtg. Nur für das Anzeigen, ob alles korrekt
        BufferedImage outputImage=new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
        outputImage.setData(outputraster);
        
        //Raster in Array
        int[] outputarray= new int[width*height];
        outputarray = outputraster.getSamples(0, 0, width, height, 0, outputarray);
        System.out.println("Länge: "+outputarray.length);
        
        //System.out.println(Arrays.toString(outputarray));
        
        //int[] outputarray = outputraster.getSamples(0, 0, width, height, 0, null);
        
        // DEBUG HACK
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new JLabel(new ImageIcon(outputImage)));
        f.pack();
        f.setVisible(true);
        
        return outputarray;
	}

}
 
Daran lags

Von Marco:
Java:
int[] outputarray= new int[width*height];
        outputarray = outputraster.getSamples(0, 0, width, height, 0, outputarray);

von mir:
Java:
int[] outputarray= new int[width*height];
outputraster.getSamples(0, 0, width, height, 0, outputarray);


Habe die zuweisung vergessen, peinlich.

Danke euch allen
 

Zurück
Oben