Java Bildschirmkoordinaten vs Bilder Dimensionen

Es gibt ein paar Punkte, auf die man da jetzt näher eingehen könnte - aber aus Zeitmangel, erstmal kurz:

Geschwindigkeit es vermutlich bei vielen Prüfpixeln schneller geht wenn es als Bild zwischengespeichert ist und daraus dann die rgb werte abgelesen werden.

Ja.

weil java meint es müsste sich um skalierungsmsit kümmern den es gefälligst iignorieren soll,

Stell’ deine Skalierung auf 1.0. Und wenn du das nicht willst, muss sich irgendjemand oder irgendwas darum kümmern. So ist das halt. Ein Problem geht nicht notwendigerweise weg, nur weil man es ignoriert.

Aber der verlinkte Gist macht wohl etwas, was du in ähnlicher Form brauchen wirst. Die Beschreibung mit dem „Error Field“ habe ich nur überflogen, und sie wirkt überkompliziert, und es stellt sich dann auch immer die Frage, wo der Skalierungsfaktor denn herkommmt, aber … dazu hatte ich ja schon auf den anderen Thread verlinkt.

(Was dort gerechnet wird ist dann ziemlich trivial)

Man findet ja bei google nicht mal eine gescheite anleitung die nicht auf der annahme basiert dass man eclipse, maven, linux und anderer msit hat oder nutzt.

Einerseits verstehe ich diese Vorbehalte gegen „Infrastrukturen“ wie Maven. Ich habe (viel zu?) lange auch mit einem Texteditor programmiert und möglichst wenige externe JARs verwendet, die ich händisch in den Classpath geschrieben habe. Aber … Lern’ damit umzugehen. Und wenn du denkst, „Java und Eclispe und Maven“ sei Sche!ße, dann empfehle ich dir, dir mal

  • JavaScript und VSCode und npm, oder
  • C++ und Visual Studio und CMake

anzuschauen, und dann wirst du wissen, „Java und Eclispe und Maven“ ist im Vergleich dazu die Manifestation des Wortes „Glückseligkeit“.


tl;dr: Man kann sich für das konkrete Problem ja was basteln, was einem das Leben einfacher macht. (Das ist übrigens das, was Programmierer den ganzen Tag über tun sollten. Ich meine, IMMER und STÄNDIG. Das ist nicht nur so dahin gesagt. Das ist WICHTIG).

Hab’ gerade nicht mehr viel Zeit, darum kannst du, wenn du willst, mal dieses Programm starten/anschauen, und sagen, was es auf der Konsole ausgibt:

package bytewelt;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;

public class RobotWithScalingTest
{
    public static void main(String[] args) throws Exception
    {
        
        System.out.println("Screen size is " 
            + RobotWithScaling.getScreenSize());
        System.out.println("Virtual screen size is " 
            + RobotWithScaling.getVirtualScreenSize());

        BufferedImage screenshot = RobotWithScaling.createFullScreenCapture();
        System.out.println("Full screen screenshot size is "
            + screenshot.getWidth() + " " + screenshot.getHeight());
        
        
    }
}

class RobotWithScaling
{
    private static final Robot ROBOT;
    private static final AffineTransform TRANSFORM;
    static 
    {
        Robot r = null;
        try
        {
            r = new Robot();
        }
        catch (AWTException e)
        {
            System.err.println("Could not initialize robot");
        }
        ROBOT = r;
        
        GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        TRANSFORM = gc.getDefaultTransform();
        
        System.out.println("TRANSFORM is " + TRANSFORM);
    }

    public static synchronized BufferedImage createFullScreenCapture()
    {
        Dimension d = getScreenSize();
        return createScreenCapture(new Rectangle(0, 0, d.width, d.height));
    }
    
    public static synchronized BufferedImage createScreenCapture(Rectangle rect) 
    {
        Point2D p0 = new Point2D.Double(rect.getMinX(), rect.getMinY());
        Point2D p1 = new Point2D.Double(rect.getMaxX(), rect.getMaxY());
        Point tp0 = convertToDevicePoint(p0);
        Point tp1 = convertToDevicePoint(p1);
        Rectangle tRect = new Rectangle(
            tp0.x, tp0.y, tp1.x - tp0.x, tp1.y - tp0.y);
        return ROBOT.createScreenCapture(tRect);
    }
    
    public static Dimension getScreenSize()
    {
        GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        DisplayMode dm = gd.getDisplayMode();
        int w = dm.getWidth();
        int h = dm.getHeight();
        return new Dimension(w, h);
    }

    public static Dimension getVirtualScreenSize()
    {
        Dimension d = getScreenSize();
        Point p = new Point(d.width, d.height);
        Point tp = convertToDevicePoint(p);
        return new Dimension(tp.x, tp.y);
    }
    
    private static Point2D convertToDevice(Point2D p)
    {
        Point2D result = new Point2D.Double();
        TRANSFORM.transform(p, result);
        return result;
    }
    private static Point convertToDevicePoint(Point2D p)
    {
        Point result = new Point();
        TRANSFORM.transform(p, result);
        return result;
    }
    
}