Hallo,
ich wollte den Code von dieser Seite
bufferedimage - Java - get pixel array from image - Stack Overflow
die 1. Antwort (die Methode ohne getRGB), in meinem Skript verwenden in etwas modifizierter Form, um einen Screnshot zu machen, den ich als BufferedImage dann verwende und eine bestimmte Reihe von Pixeln des Bildes untersuche. Den Screenshot erst als jpg zu speichern um ihn dann wieder einzulesen wäre ja eher witzlos.
Will im Endeffekt gucken ob sich in der Pixelreihe ein rotes, grünes oder weißes Pixel befindet oder eben keins der 3.
Hierzu habe ich den nachfolgenden Code geschrieben:
public String ResultHelp() throws InterruptedException{
BufferedImage image = bot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
final int width = image.getWidth();
final int height = image.getHeight();
final boolean hasAlphaChannel = image.getAlphaRaster() != null;
int R=0;
int G=0;
int B=0;
final int pixelLength = hasAlphaChannel?4:3;
final int fac=pixelLength-3;
//int x=1370;
//int y=105;
for(int x=1370, y=105; x<=1418;x++){
int pixel=y*(width*pixelLength)+x*pixelLength;
B= ((int) pixels[pixel + fac] & 0xff); // blue
G= (((int) pixels[pixel + fac+1] & 0xff) << 8); // green
R= (((int) pixels[pixel + fac+2] & 0xff) << 16); // red
if(B>=80){
return "S";
}
else if(R>=80){
return "R";
}
else if(G<80){
//Fall ohne Treffer
continue;
}
else{
return "Z";
}
//1370,105 bis 1418,105
//RGB alle unter 30->nichts
//R>80, bg<80->rot
//rgb alle >80->schwarz aka B>80
//g>80, br<80->Null
}
Thread.sleep(150);
return "N";
}
Keine Sorge, mein Script ist viel größer, hässlicher und unübersichtlicher.
Aber ich habe DIeselben klassen wie im kommentar auf gerwähnter Seite imported und der Robot , den ich bot genannt habe, ist ausserhalb der Methode auch definiert.
Nun bekomme ich aber beim Ausführen (wohlgemerkt nicht schon beim kompilieren!) diesen Fehler:
Exception in thread "main" java.lang.ClassCastException: class java.awt.image.DataBufferInt cannot be cast to class java.awt.image.DataBufferByte (java.awt.image.DataBufferInt and java.awt.image.DataBufferByte are in module java.desktop of loader 'bootstrap')
at Test.ResultHelp(Test.java:522)
at Test.GetResult(Test.java:588)
at Test.DoUpdatesAfterRoll(Test.java:513)
at Test.run(Test.java:119)
at Test.<init>(Test.java:97)
at Test.main(Test.java:86)
Ich habe nur wenig Ahnung vo dem, was da genau passiert mit den DatenBuffern und Co.
Ich habe auch, zum vergleich, mal den Originalcode aus dem kommentar benutzt, der wird komsicherweise ohne rigendeine Classcastexception ausgeführt.
Die Variable image sit doch vom Typ BufferedImage, wie im Originalcode auch, also warum kommt es heir dann zu dieser ClassCastexception?
Ich mache doch nix Anderes als, statt eine externe jpg Datei als Bufferedimage einzulesen, eben den robot einen Screenshot mahcen zu lassen, der als Bufferedimage gespeichert wird O_o
Ich danke jeden iM Voraus, denn ich blicke gerade gar nicht durch