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. Dieser Leitfaden erklärt, 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.

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).

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.

Kritisch für Automation: 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