• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Pixel direkt vom Bildschirm auslesen?

stromij

Neues Mitglied
Hallo Experten!

Nach langer Suche mit Google stelle ich fest, dass Google in diesem Fall nicht mein Freund ist - zumindest finde ich nichts Themabezogenes.

Hier meine eigentlich ziemlich simple Frage: Kann ich einen Pixel direkt vom Bildschirm auslesen?

Der Pixel wurde MAL von einem BufferedImage aufgespielt, aber da dieses BufferedImage immer wieder von einem Keylistener verschoben wird, ist es nicht so einfach den Pixel durch .getRGB anzusteuern.

Ich hoffe ich bin verständlich und ihr könnt mir helfen.

Grüße
Stromi

EDIT: Es handel sich um Java ;-)
 
Zuletzt bearbeitet:
Werbung:
Werbung:
Nach langer Suche mit Google stelle ich fest, dass Google in diesem Fall nicht mein Freund ist - zumindest finde ich nichts Themabezogenes.
Seltsam, ich habe exakt den Titel, den du hier eingetippt hast in google eingeben, dazu noch "java" und finde innerhalb einer Minute das Gewünschte. Entweder ist deine Suchstrategie nicht ausgereift oder du erzählst uns nicht die Wahrheit.

Pixel direkt vom Bildschirm auslesen? - Google Search

Das 3. Ergebnis führt auf einen Forumeintrag, der die von Commodore gezeigte Klasse ausführlich beschreibt und die Verwendung zeigt.
 
Ich glaube meine Suchstrategie ist einfach nicht ausgefeilt. Ich habe alles Mögliche eingegeben, doch natürlich nicht den Titel dieses Themas. warum weiß ich selber nicht... Trotzdem noch mal danke an alle!
 
Haha, das ist jetzt ne lustige Sache: Ich setzte über

Code:
g.setColor(new Color(0,0,0))
g.fillRect(x,y,2,2)

vier Pixel auf Schwarz an der Stellel (x|y).
Der Hacken ist, wenn ich jetzt frage:

Code:
Robot robot = new Robot();
System.out.println(robot.getPixelColor(x,y));

gibt er mir irgendwelche Werte aus, aber kein [r=0,g=0,b=0] oder [r=255,g=255,b=255].

Da kommt eher [r=167,g=176,b=184]. Und wenn ich nun in robot.getPixelColor(x+1,y+1) rechne, kommt wieder was anderes raus, obwohls doch auf dem Bildschirm und(!) im Programm die selbe Farbe ist?!?

Hab ich jetzt was überlesen, oder ist das nicht normal?
 
Werbung:
Die Koordinaten die du dem robot übergibst sind absolute Koordinaten bezogen auf den gesamten Bildschirm.
 
Okay, das wusste ich nicht, aber jetzt ist das ein Vollbild, also sollte das nicht das Problem sein, denn die Koordinate (0|0) liegt folglich in der Ecke links oben, oder?
 
Ich denke schon, liefert es denn immer noch falsche Ergebnisse?


Probier dann einfach mal ein wenig mit statischen Werten rum, setze mal ein kleines Rechteck oben links in die Ecke und versuch das auszulesen.
 
Werbung:
Jetzt hab ich nen komplett Schwarzen Bildschirm und trotz dessen komt auf (0|0) [r=198,g=186,b=176] raus, auf (10|0) [r=189,g=187,b=185] und auf (11|11) kommt [r=49,g=52,b=127] raus?!? ich versteh das einfach nicht... :-?

Noch besser ist: Wenn ich die Farbe wechsel, bleiben die Werte gleich!

Ist das noch Logik? Wenn ja, wo ist sie?
 
Ich hab mal ein wenig nach dem Problem gesucht, scheinbar ist das Setzen von Farben nicht "schnell genug".


Ich könnte es mir so erklären, dass die Frequenz des Bildschirm z.B. 60 Hz beträgt, das Programm allerdings viel schneller läuft. Das bedeutet, dass zwar bereits in irgendeinen Buffer die richtige Farbe steckt, allerdings der Robot die Farbe vom Bildschirm ausliest, noch ehe der Buffer auf dem Bildschirm übertragen wird.


Als mögliche Lösung des Problems wurde gesagt, dass man erst noch ein sleep einbaut, ehe man die Farbe einliest. Du könntest allerdings auch mal schauen ob es in deiner Grafiklib irgendeinen Befehlt gibt, um den Buffer auf den Bildschirm zu schreiben oder so lange zu warten, bis das geschehen ist.
 
Hey!

Hier noch mal zum Nachvollziehen mein Code:

Code:
package testpackage;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Robot;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;


public class Test extends JFrame {
    private static final long serialVersionUID = 1L;    

public Test()
       {setUndecorated(true);                                                                                                
        setVisible(true);
        GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);
       }

public void paint( Graphics g )
    {Dimension groesse=getSize();
     try {Thread.sleep(2000);} catch (InterruptedException e1) {}
    
     BufferedImage offscreenImage = new BufferedImage( groesse.width, groesse.width, BufferedImage.TYPE_INT_RGB );

     Graphics2D t = offscreenImage.createGraphics();
     
     t.setColor(new Color(0,0,0));
     t.fillRect(0,0,groesse.width,groesse.height);
     g.drawImage(offscreenImage, 0, 0, this );
     
     try {Thread.sleep(2000);} catch (InterruptedException e2) {e2.printStackTrace();}
     
    System.out.println("done");
     try {
        Robot robot = new Robot();
        System.out.println(robot.getPixelColor(7,7));
    
     } catch (AWTException e) {e.printStackTrace();} 
     
    }

public static void main(String[] args) 
    {new Test();}

}
Ich hab jetzt mehrere Verzögerungen eingebaut und Sicherheitsausgaben. Trotzdem funzt es nicht. Das Resultat ist jetzt:

done
java.awt.Color[r=121,g=116,b=182]

In meiner Grafiklib hab ich nichts gefunden, aber da bin ich noch nicht der Meister mit, also könnte ich evtl. doch noch was finden :-)
 
Werbung:
Hier bin ich leider überfragt, manchmal liefert es bei mir die richtigen Ergebnisse, manchmal nicht. Vielleicht liegt es an der Stelle, an der du die Abfrage einbaust. Unter Umständen muss die Methode paint ja erst durchlaufen, ehe irgendwelche Änderungen registriert werden können [weil intern noch andere Funktionen aufgerufen werden].


Bau das Auslesen des Pixels mal an einer anderen Stelle ein, z.B. erst bei einem Mausklick.
 
Ich hab den Fehler. Der liegt keineswegs in der paintmethode, sondern im Vollbild.
Für alle die es interessiert: Führt das Programm aus und macht ein Screenshot! Dann werdet ihr sehen, welche Pixelfarbe er ausliest. Da ist es nicht wunderlich, dass komische Werte rauskommen.

Folgendes habe ich im Follbild geändert:

Code:
setUndecorated( true );
     GraphicsDevice device; 
     device=GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0]; 
     device.setFullScreenWindow(this);
     device.setDisplayMode(new DisplayMode(Variablen.bildschirmaufloesung.width,Variablen.bildschirmaufloesung.height,16,0));
     addKeyListener(this);
     setVisible(true);

Jetzt sollte es funktionieren ;-)

Trotzdem Danke Commodore!

Grüße
Stromi
 
Zurück
Oben