CSS-Pixel vs. Physische Pixel: Technischer Leitfaden zu DPI-Skalierung & Retina

Wenn Sie schon einmal Koordinaten aus einem Webbrowser in ein Desktop-Automatisierungstool übertragen und ins Leere geklickt haben, kennen Sie bereits den Unterschied zwischen CSS-Pixeln und physischen Pixeln. Was Device Pixel Ratio (DPR) wirklich bedeutet, warum Betriebssysteme Displays skalieren, und wie Sie Automatisierungscode schreiben, der korrekt funktioniert.

Koordinatentool öffnen

CSS-Pixel vs. Physische Pixel: Der Unterschied

Physische Pixel sind die tatsächlichen, mikroskopischen LED- (oder OLED-) Punkte auf Ihrem Monitor-Panel. Ein 4K-Display mit 3840 x 2160 hat exakt 8.294.400 physische Pixel. Desktop-Automatisierungstools wie AutoHotkey und PyAutoGUI arbeiten ausschließlich in diesem physischen Pixelraum.

Faustregel: Jedes Tool, das den physischen Mauszeiger bewegt, muss physische Pixelkoordinaten verwenden oder explizit für Skalierung kompensieren.

CSS-Pixel in physische Pixel umrechnen

CSS-Pixel sind eine Abstraktion von Webbrowsern, um Text über Geräte hinweg lesbar zu halten. Ohne CSS-Pixel wäre eine 16px-Schrift auf einem 4K-Smartphone mikroskopisch klein.

In JavaScript lesen Sie den aktuellen Wert mit window.devicePixelRatio. Ein Standard-Monitor gibt 1 zurück, ein MacBook Pro gibt 2 zurück.

Device Pixel Ratio (DPR) erklärt

Das Device Pixel Ratio ist die Brücke zwischen CSS-Pixeln und physischen Pixeln. Es beantwortet die Frage: "Wie viele physische Pixel ergeben ein CSS-Pixel?"

// JavaScript
const dpr = window.devicePixelRatio; // z.B. 1, 1.25, 1.5, 2, 3
const cssWidth  = window.innerWidth;
const physWidth = cssWidth * dpr;

Die Formeln:

Physische Koordinate = CSS-Koordinate × Device Pixel Ratio
CSS-Koordinate       = Physische Koordinate / Device Pixel Ratio

Häufige Falle: Chrome DevTools meldet standardmäßig CSS-Pixelkoordinaten. Wenn Sie diese Zahlen direkt in ein OS-Automatisierungsskript kopieren, funktioniert es nur auf Displays mit DPR = 1.

Bruchteil-DPR-Werte

DPR ist nicht immer eine ganze Zahl. Windows-Laptops verwenden häufig 125%-Skalierung, was einen DPR von 1,25 ergibt. Für Automatisierungszwecke runden Sie physische Koordinaten immer auf die nächste Ganzzahl.

Wie DPI-Skalierung Bildschirmkoordinaten unter Windows beeinflusst

Moderne Laptops packen oft 1080p oder 4K in 13- oder 14-Zoll-Panels. Bei nativem 1:1-Scaling wäre der Text unlesbar klein. Betriebssysteme lösen dies durch DPI-Skalierung.

Wie Windows mit Skalierung umgeht

Windows bietet Skalierungsoptionen wie 100%, 125%, 150% und 200%. Bei 125% teilt Windows Anwendungen mit, der Bildschirm sei kleiner als in Wirklichkeit. Ein 1920 x 1080-Monitor meldet bei 125% eine logische Auflösung von 1536 x 864.

Wie macOS mit Skalierung umgeht

macOS verwendet einen anderen Ansatz. Ein Retina MacBook Pro mit nativer Auflösung von 2880 x 1800 verwendet standardmäßig einen "Sieht aus wie 1440 x 900"-Modus. Das System rendert den Desktop bei 2880 x 1800, präsentiert ihn aber als 1440 x 900.

Screenshot-Hinweis: Die auf dem Bildschirm angezeigten Koordinaten sind logische Punkte, aber die gespeicherte Bilddatei wird in Retina-Auflösung gerendert — eine 100×100 Punkt-Auswahl erzeugt ein 200×200 Pixel PNG auf einem 2×-Display. Wenn Sie Screenshots für die Bilderkennung (OpenCV, Template-Matching) verwenden, arbeiten Sie mit dem Bild in voller Auflösung, nicht mit den logischen Abmessungen.

Bildschirmkoordinaten auf Retina- & HiDPI-Displays

Die meisten Programmiersprachen lesen standardmäßig die logische Auflösung. Ein 1920 x 1080-Bildschirm mit 125%-Skalierung wird von Python's PyAutoGUI möglicherweise als 1536 x 864 gesehen.

Windows-Fix (Python + PyAutoGUI)

import ctypes
import pyautogui

# DPI-Awareness VOR pyautogui deklarieren
ctypes.windll.user32.SetProcessDPIAware()

width, height = pyautogui.size()
print(f"Physische Bildschirmgröße: {width}x{height}")
pyautogui.click(x=960, y=540)

Wichtig: SetProcessDPIAware() muss vor der Initialisierung jeder Bibliothek aufgerufen werden. Für Multi-Monitor-Setups verwenden Sie SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2).

DPI-Bewusstsein allein ist nicht die komplette Lösung. Nach dem Aufruf von SetProcessDPIAware() meldet und verwendet PyAutoGUI physische Pixel. Wenn Sie Ihre Zielposition jedoch in einem Browser gemessen haben (Chrome DevTools, getBoundingClientRect()), ist diese Position in CSS-Pixeln — Sie müssen sie immer noch mit dem DPR multiplizieren, bevor Sie sie an PyAutoGUI übergeben: pyautogui.click(css_x * dpr, css_y * dpr). Siehe die Umrechnungsformel oben.

Windows-Fix (AutoHotkey v2)

#Requires AutoHotkey v2.0
DllCall("SetProcessDPIAware")
width := A_ScreenWidth
height := A_ScreenHeight
Click(960, 540)

macOS-Fix

# macOS: Logische Punkte zu physischen Pixeln
logical_x, logical_y = 720, 450
backing_scale = 2.0  # Normalerweise 2.0 auf Retina Macs
physical_x = int(logical_x * backing_scale)
physical_y = int(logical_y * backing_scale)

Plattformspezifische Lösungen

PlattformAPI / MethodeFunktion
Windows (Python)ctypes.windll.user32.SetProcessDPIAware()Lässt den Prozess physische Pixel lesen
Windows (C#)SetProcessDPIAware() oder app.manifestManifest bevorzugt für Produktion
Windows (AHK)DllCall("SetProcessDPIAware")Erzwingt physische Bildschirmmaße
macOS (Swift)NSScreen.main?.backingScaleFactorGibt DPR des Hauptdisplays zurück
macOS (Python)PyAutoGUI (kein Extra-Setup)PyAutoGUI verwendet Quartz, meldet physische Koordinaten
Web (JavaScript)window.devicePixelRatioGibt DPR des aktuellen Viewports zurück

Browser-Zoom vs. OS-Skalierung

Diese beiden Konzepte werden oft verwechselt, beeinflussen aber Koordinaten auf völlig unterschiedliche Weise.

OS-Display-Skalierung

OS-Skalierung ändert global die Beziehung zwischen CSS-Pixeln und physischen Pixeln. Sie betrifft jede Anwendung im System.

Browser-Zoom

Browser-Zoom (Ctrl + Plus) ändert die Größe eines CSS-Pixels relativ zum Viewport, ohne die OS-Skalierungsschicht zu berühren. Chrome bei 150% Zoom erhöht window.devicePixelRatio um 1,5x.

Beachten Sie: Browser-Zoom ändert nicht die globalen Monitor-Koordinaten, die PyAutoGUI oder AutoHotkey sehen. Setzen Sie Browser-Zoom immer auf 100% zurück, bevor Sie Koordinaten für Cross-Tool-Workflows aufzeichnen.

Schnellreferenz-Tabelle

DisplayNative AuflösungTypische OS-SkalierungLogische AuflösungDPR
Standard 24" Monitor1920 x 1080100%1920 x 10801.0
15" Gaming-Laptop1920 x 1080125%1536 x 8641.25
13" Ultrabook2560 x 1440150%1707 x 9601.5
MacBook Pro 14"3024 x 1964"Sieht aus wie 1512 x 982"1512 x 9822.0
27" 4K Monitor3840 x 2160150% oder 200%2560 x 1440 (bei 150%)1.5 oder 2.0
Zurück zum Leitfaden Plattform-Leitfäden Bildschirmmitte automatisch finden