Έγγραφο σε φυσικό μέγεθος στην οθόνη: στο web και στο Linux

Γιατί τα 10 εκατοστά του χαρτιού δεν βγαίνουν 10 εκατοστά στην οθόνη, και τι χρειάζεται για να βγουν

Σχηματικό: ένα έγγραφο που η οθόνη δείχνει ως 10 cm, μετρημένο με χάρακα πάνω στο τζάμι, φτάνει περίπου τα 11 cm.

Τις περισσότερες φορές δεν μας νοιάζει πόσο μεγάλο βγαίνει κάτι στην οθόνη, αρκεί να διαβάζεται. Υπάρχουν όμως τομείς όπου το μέγεθος είναι η ίδια η πληροφορία, και η παρουσίαση 1:1, για παράδειγμα 10 εκατοστά στο πρωτότυπο και 10 εκατοστά στην οθόνη, είναι απαίτηση:

  • Αρχειονομία και πολιτιστική κληρονομιά: ένα σκαναρισμένο έγγραφο, μια σφραγίδα, ένα νόμισμα, ένα γραμματόσημο, όπου οι διαστάσεις είναι μέρος της περιγραφής του αντικειμένου.
  • Σελιδοποίηση και προεκτύπωση (DTP): μια σελίδα, ένα μέγεθος γραμμάτων ή μια συσκευασία, ελεγμένα στο μέγεθος που θα τυπωθούν.
  • Ιατρικές εφαρμογές: τεστ όρασης, όπου το μέγεθος των γραμμάτων μαζί με την απόσταση ορίζει το αποτέλεσμα, και παρουσίαση ακτινογραφιών και μαστογραφιών σε πραγματικό μέγεθος.
  • Έρευνα της όρασης: πειράματα που τρέχουν στον φυλλομετρητή του συμμετέχοντα και χρειάζονται το μέγεθος του ερεθίσματος σε μοίρες οπτικής γωνίας, άρα το φυσικό του μέγεθος.
  • Μηχανική και σχέδιο: σχέδια σε κλίμακα 1:1, το αποτύπωμα ενός εξαρτήματος, ένα πατρόν.
  • Ηλεκτρονικό εμπόριο: μέτρηση δαχτυλιδιών, σκελετοί γυαλιών, «δες το στο πραγματικό του μέγεθος».

Στο χαρτί το πρόβλημα έχει λυθεί, με ένα δοκιμαστικό τετράγωνο: τα πατρόν ραπτικής σε PDF ζητούν εκτύπωση στο 100% και τυπώνουν ένα τετράγωνο γνωστής πλευράς, που το μετράς πριν κόψεις ύφασμα. Στην οθόνη δεν έχει λυθεί, ούτε στο web ούτε, εντελώς, στις εφαρμογές του Linux.

Η δική μου αφορμή είναι η πρώτη: θέλω ένα σκαναρισμένο έγγραφο του αρχείου μου, που στο χαρτί μετράει 10 × 10 cm, να μετράει 10 × 10 cm και στην οθόνη. Εδώ εξηγώ γιατί αυτό είναι δύσκολο, τι βρήκα μετρώντας τις δύο οθόνες μου και τι εργαλεία έφτιαξα.

Η σύντομη απάντηση

Μια σελίδα δεν μπορεί να μάθει από μόνη της πόσα εκατοστά είναι η οθόνη του αναγνώστη. Για να δείξει κάτι σε φυσικό μέγεθος χρειάζεται:

  1. βαθμονόμηση, με τραπεζική κάρτα ή χάρακα·
  2. αποθήκευση του effective DPI, των πραγματικά ζωγραφισμένων pixel ανά ίντσα τζαμιού·
  3. νέο υπολογισμό των pixel της CSS όταν αλλάζει το zoom·
  4. και, για το ίδιο το αρχείο, την κλίμακά του: πόσα pixel του αρχείου κάνουν ένα εκατοστό του πρωτοτύπου.

Το EDID της οθόνης είναι χρήσιμη αρχική τιμή, όχι εγγύηση: μπορεί να είναι λάθος.

Λίγη ιστορία: πώς το web παραιτήθηκε από τα αληθινά εκατοστά

Η CSS έχει μονάδες που μοιάζουν φυσικές: cm, mm, in, pt. Στις CSS 1 και 2 είχαν σχεδιαστεί να αντιστοιχούν σε αληθινά μήκη. Οι φυλλομετρητές όμως δεν είχαν αξιόπιστο τρόπο να μάθουν το μέγεθος της οθόνης, οπότε το αποτέλεσμα διέφερε από τον έναν στον άλλο. Ο Internet Explorer και το WebKit είχαν ήδη κλειδώσει την ίντσα στα 96 pixel, και γύρω στο 2010 η αναθεώρηση που έγινε CSS 2.1 το έκανε κανόνα: 1in = 96px. Από τότε το width: 10cm σημαίνει πάντα 378 pixel της CSS, όποια κι αν είναι η οθόνη. Σε ένα laptop 14 ιντσών με 1920 × 1080 και κλίμακα 100%, που έχει περίπου 157 pixel ανά ίντσα, τα «10 cm» βγαίνουν περίπου 6,1 cm.

Το 2010 προτάθηκαν στη λίστα της CSS ξεχωριστές «αληθινές» μονάδες, truemm και truept. Η αντίρρηση που επικράτησε ήταν ότι δεν βοηθούν κανέναν όσο η σχέση pixel και πραγματικού μήκους δεν είναι γνωστή με βεβαιότητα, και ότι η ανάμειξη λογικών και αληθινών μονάδων θα χαλούσε σελίδες. Ο Firefox έβγαλε το 2010 ένα πειραματικό αληθινό χιλιοστό, το mozmm, κυρίως για το μέγεθος των στόχων αφής, και το αφαίρεσε στην έκδοση 59 (2018), επειδή κανένας άλλος φυλλομετρητής δεν ενδιαφέρθηκε να το υλοποιήσει.

Στο web η πόρτα κλείνει για λόγους ιδιωτικότητας. Το λειτουργικό συνήθως ξέρει το φυσικό μέγεθος της οθόνης, γιατί η ίδια η οθόνη το δηλώνει στα δεδομένα EDID που στέλνει μέσα από το καλώδιο. Οι φυλλομετρητές δεν τα περνούν στις σελίδες: τα χαρακτηριστικά της οθόνης είναι γνωστό μέσο για fingerprinting (αναγνώριση ενός υπολογιστή χωρίς cookies), και η τάση είναι να δίνονται λιγότερα δεδομένα, όχι περισσότερα. Ο Tor Browser κρύβει τελείως τις φυσικές τιμές της οθόνης. Ένα αίτημα του 2019 να εκτεθούν τα δεδομένα του EDID στους προγραμματιστές δεν προχώρησε.

Άρα καμία σελίδα δεν μπορεί να ξέρει από μόνη της πόσο μεγάλη είναι η οθόνη του αναγνώστη. Το νούμερο πρέπει να μετρηθεί.

Η διαδρομή του μεγέθους έχει πέντε στάδια, και σφάλμα σε οποιοδήποτε από αυτά αλλάζει το τελικό αποτέλεσμα:

οθόνη (EDID) → οδηγός → compositor / κλιμάκωση → εφαρμογή ή φυλλομετρητής → pixel της CSS

Το web βλέπει μόνο το τελευταίο στάδιο. Δεν βλέπει ούτε το φυσικό μέγεθος που δηλώνει η οθόνη ούτε την κλιμάκωση που έχει επιλέξει το λειτουργικό.

Και στο Linux; Το λειτουργικό ξέρει, αλλά όχι πάντα σωστά

Μια κανονική εφαρμογή δεν είναι κλεισμένη σε κουτί όπως μια σελίδα. Μπορεί να ρωτήσει το λειτουργικό: τα Windows έχουν το MDT_RAW_DPI, το Qt το physicalDotsPerInch, το GTK το gdk_monitor_get_width_mm, και στο X11 το xrandr τυπώνει το μέγεθος σε χιλιοστά (π.χ. 527mm x 296mm). Παρ’ όλα αυτά οι εφαρμογές αποτυγχάνουν με τους ίδιους τρεις τρόπους:

  1. Τα δεδομένα μπορεί να είναι λάθος. Το API απλώς μεταφέρει ό,τι λέει το EDID της οθόνης. Στρογγυλεμένα μεγέθη, μηδενικά μεγέθη (τηλεοράσεις, προβολείς) και λάθος τιμές περνούν ανέλεγκτα.
  2. Η κλιμάκωση μπερδεύει τα λογικά με τα φυσικά pixel. Είναι το πιο συνηθισμένο σφάλμα. Το Evince του GNOME, όταν η οθόνη είχε κλίμακα 2 στο Wayland, έδειχνε το «100%» στο διπλάσιο μέγεθος. Το Okular του KDE αποδιδόταν κάποτε σταθερά στα 72 DPI, οπότε το «100%» έβγαινε περίπου 67%. Το Photoshop θέλει από τον χρήστη να πληκτρολογήσει την ανάλυση της οθόνης, και σε οθόνη Retina να θυμηθεί να τη διπλασιάσει.
  3. Πολλές οθόνες. Το DPI ανήκει σε μια οθόνη, όχι στην εφαρμογή. Ένα παράθυρο που απλώνεται σε δύο οθόνες με διαφορετική πυκνότητα δεν έχει ένα σωστό μέγεθος.

Γι’ αυτό ακόμα και η ιατρική απεικόνιση, όπου το πραγματικό μέγεθος είναι απαίτηση, δεν εμπιστεύεται μόνο το λειτουργικό: βαθμονομεί, και ελέγχει με χάρακα. Η δοκιμή της IHE για τις οθόνες μαστογραφίας ζητά οριζόντια και κατακόρυφα να συμφωνούν μέσα σε 2,5%.

Δύο πυκνότητες, και τι κάνει η καθεμία

Για να καταλάβει κανείς τι πάει στραβά, χρειάζονται δύο νούμερα, που απαντούν σε διαφορετικές ερωτήσεις:

  • CSS ppi: πόσα pixel της CSS πέφτουν σε μια πραγματική ίντσα τζαμιού. Ό,τι γράφεται σε CSS είναι σε pixel της CSS, άρα αυτό το νούμερο αποφασίζει το μέγεθος.
  • Effective DPI: πόσα pixel της συσκευής ζωγραφίζει ο φυλλομετρητής (ή οποιαδήποτε εφαρμογή) ανά πραγματική ίντσα. Είναι πάντα CSS ppi × devicePixelRatio, και αποφασίζει την ευκρίνεια: πόσα pixel χρειάζεται το αρχείο της εικόνας.

Ο όρος «effective DPI» δεν είναι καθιερωμένος, και προσοχή: στα Windows σημαίνει σχεδόν το αντίθετο, την κλιμακωμένη, λογική τιμή (96 × κλίμακα, π.χ. 120 σε κλίμακα 125%), ενώ το φυσικό νούμερο εκεί λέγεται «raw DPI». Εδώ, με τον όρο effective DPI, εννοώ πάντα τα πραγματικά ζωγραφισμένα pixel ανά ίντσα τζαμιού. Μοιάζει περισσότερο με το «effective ppi» της εκτύπωσης: πόσα pixel μιας εικόνας πέφτουν σε μια ίντσα στο τελικό τυπωμένο μέγεθος.

Το effective DPI δεν είναι κατ’ ανάγκη η πυκνότητα του πάνελ. Με κλασματική κλιμάκωση (π.χ. 125%), το σύστημα μπορεί να ζωγραφίζει σε μεγαλύτερη επιφάνεια και μετά να τη σμικρύνει στα pixel της οθόνης. Αυτή η «ζωγραφισμένη επιφάνεια» είναι που μετράει, και εδώ αρχίζει η ιστορία της πρώτης μου οθόνης.

Δύο οθόνες, δύο διαφορετικά προβλήματα

Στο γραφείο μου έχω δύο οθόνες 24 ιντσών δίπλα δίπλα, και η καθεμία δείχνει ένα άλλο πρόβλημα:

  • Lenovo P24QD-40: σωστό EDID, μπερδεμένα pixel. Το μέγεθος που δηλώνει είναι σωστό, αλλά το πόσα pixel ζωγραφίζονται σε μια ίντσα εξαρτάται από τη συνεδρία: 197 σε X11, 123 σε Wayland, για το ίδιο τζάμι. Το μέγεθος σε CSS μένει ίδιο, γιατί το devicePixelRatio αλλάζει αναλογικά. Όποιος μπερδέψει τα δύο βγάζει το έγγραφο διπλάσιο ή μισό, η παγίδα του Evince. Και στο X11 οι οθόνες είναι δεμένες μεταξύ τους: η Lenovo σε κλίμακα 125% αναγκάζει και την LG δίπλα να ζωγραφίζεται στο διπλάσιο.
  • LG 24MP57VQ-P: το EDID λέει ψέματα. Δηλώνει οθόνη 21,7 ιντσών ενώ είναι 23,8, και το ίδιο ακριβώς δηλώνουν και οι 127 μονάδες του ίδιου μοντέλου στη βάση linuxhw/EDID. Ό,τι εμπιστεύεται το λειτουργικό σχεδιάζει ένα έγγραφο 10 cm σε 10,98 cm. Η τραπεζική κάρτα έδωσε το σωστό νούμερο, 0,6% από τις προδιαγραφές του μοντέλου.

Το δίδαγμα είναι αυτό που ήθελα να γράψω εξαρχής: στην LG ακόμα και μια «σωστή», native λύση στο Linux χρειάζεται βαθμονόμηση. Κάθε εφαρμογή που εμπιστεύεται το EDID, όσο προσεκτικά κι αν χειρίζεται την κλιμάκωση, θα δείξει το έγγραφο 10% μεγαλύτερο. Το EDID είναι καλή αρχική τιμή, αλλά μόνο μια εξωτερική αναφορά (κάρτα, χάρακας ή φύλλο προδιαγραφών) πιάνει το λάθος.

Οι μετρήσεις αναλυτικά, με τους πίνακες για κάθε οθόνη και κάθε μέθοδο, είναι στη σελίδα Δύο οθόνες: οι μετρήσεις αναλυτικά.

Οι λύσεις

Η λογική είναι ίδια με αυτή των καλύτερων εφαρμογών: μια αυτόματη αρχική τιμή, μια βαθμονόμηση που την υπερισχύει, και μια ένδειξη για το από πού ήρθε το τρέχον μέγεθος.

Στον φυλλομετρητή: τα εργαλεία του site

Τα εργαλεία τρέχουν εξ ολοκλήρου στον φυλλομετρητή, και τίποτα δεν στέλνεται πουθενά:

  • Υπολόγισε το DPI της οθόνης σου: σέρνεις έναν εικονικό χάρακα μέχρι να ταιριάξει με έναν αληθινό, ή ακουμπάς μια τραπεζική κάρτα στα πορτοκαλί σημάδια. Η κάρτα έχει παντού το ίδιο μέγεθος (ISO/IEC 7810 ID-1, 85,60 × 53,98 mm) και την έχει σχεδόν ο καθένας, ενώ χάρακα όχι. Δίνει το CSS ppi και το effective DPI, και τα κρατάει στον φυλλομετρητή ώστε να τα ξαναβρίσκουν τα άλλα εργαλεία.
  • Δοκιμή pixel: τετράγωνα με διαγράμμιση μιας κουκκίδας. Δείχνουν με το μάτι αν η οθόνη αποδίδει το μοτίβο ακέραιο ή το ξαναδειγματοληπτεί, και το τετράγωνο που μετράει ακριβώς μια ίντσα ονομάζει το effective DPI. Είναι ο διασταυρωτικός έλεγχος.
  • Η ανάλυση της οθόνης σου: ανάλυση, devicePixelRatio, viewport, όπως τα βλέπει ο φυλλομετρητής. Εκεί που ο φυλλομετρητής δεν μπορεί να ξεχωρίσει μια πραγματική οθόνη Retina από μια λειτουργία «ζωγράφισε μεγάλα και σμίκρυνε», ρωτάει τον αναγνώστη την εγγενή ανάλυση του πάνελ, αντί να υποθέσει.
  • Μέγεθος & χώρος κειμένου: πόσο φυσικό χώρο πιάνει ένα κείμενο, πάνω σε μιλιμετρέ χαρτί, με το DPI που μέτρησε το πρώτο εργαλείο.

Αντί για κάρτα, αρκεί και η διαγώνιος της οθόνης, αν ξέρεις την πραγματική ανάλυση του πάνελ· είναι ένα στοιχείο που οι περισσότεροι θυμούνται:

effective DPI = √(πλάτος² + ύψος²) / διαγώνιος σε ίντσες

με πλάτος και ύψος τα ζωγραφισμένα pixel (screen.width × devicePixelRatio). Έχει δύο αδυναμίες. Οι οθόνες πωλούνται με στρογγυλεμένο μέγεθος (ένα «24άρι» είναι συχνά 23,8″), και μια λάθος απάντηση δεν φαίνεται πουθενά: αν κάποιος πει 24 για μια οθόνη 27 ιντσών, το έγγραφο βγαίνει 12,5% μεγαλύτερο χωρίς κανένα σημάδι. Με την κάρτα βλέπεις αν ταιριάζει.

Η συνταγή για μια σελίδα που θέλει να δείξει έγγραφο σε φυσικό μέγεθος βρίσκεται στη σημείωση του κήπου Web presentation of a document at physical size. Περιλαμβάνει και την παγίδα να πολλαπλασιάσεις το devicePixelRatio δύο φορές, οπότε το έγγραφο βγαίνει διπλάσιο. Η ουσία: αποθήκευσε το effective DPI, γιατί δεν αλλάζει με το zoom του φυλλομετρητή, και υπολόγιζε κάθε φορά από αυτό το μέγεθος σε CSS.

Ένα τετράγωνο 10 × 10 cm, αν ξέρεις το effective DPI

Παράδειγμα η LG, με την τιμή της κάρτας: effective DPI 186,3, και devicePixelRatio 2 (X11 με τις δύο οθόνες). Το devicePixelRatio το δίνει ο φυλλομετρητής, το effective DPI θα πρέπει να το δώσεις εσύ.

  1. Pixel της συσκευής ανά εκατοστό: effective DPI / 2,54 = 186,3 / 2,54 = 73,35.
  2. Pixel της συσκευής για 10 cm: 73,35 × 10 = 733,5. Τόσα pixel χρειάζεται το αρχείο της εικόνας σε κάθε πλευρά για να μην τεντωθεί (εδώ τουλάχιστον 734).
  3. Pixel της CSS για 10 cm: 733,5 / devicePixelRatio = 733,5 / 2 = 366,7. Αυτό το νούμερο γράφεται στη CSS.
<div style="width: 366.7px; height: 366.7px; border: 1px solid black"></div>

Σε JavaScript, με τον τρέχοντα devicePixelRatio:

const effDpi = 186.3;                                // μετρημένο, ανήκει στην οθόνη
const px = 10 / 2.54 * effDpi / devicePixelRatio;    // pixel της CSS για 10 cm
box.style.width = box.style.height = px + "px";

Δύο σημεία χρειάζονται προσοχή. Μη γράψεις στη CSS τα 733,5 του βήματος 2: ο φυλλομετρητής θα τα πολλαπλασιάσει ξανά με το 2 και το τετράγωνο θα βγει 20 cm. Και αν ο αναγνώστης κάνει zoom (Ctrl +), αλλάζει το devicePixelRatio, όχι το effective DPI· επανέλαβε λοιπόν το βήμα 3 με τη νέα τιμή. Στο τέλος, αν το μετρήσεις, θα πρέπει να δείχνει 10 cm.

Στο Linux: effective-dpi

Για την πλευρά του λειτουργικού έγραψα το effective-dpi, δύο μικρά εργαλεία σε Python χωρίς εξαρτήσεις, για X11 και για GNOME σε Wayland:

  • effective-dpi τυπώνει για κάθε οθόνη το φυσικό μέγεθος, τα pixel του πάνελ, τη ζωγραφισμένη επιφάνεια, το effective DPI, το devicePixelRatio, το CSS ppi και πόσα pixel της CSS κάνουν 10 cm. Αυτό που δεν βρήκα σε κανένα άλλο εργαλείο είναι ακριβώς ότι μετράει τη ζωγραφισμένη επιφάνεια και όχι το πάνελ (197 αντί για 123 στη Lenovo σε X11), και ότι μεταφράζει το αποτέλεσμα σε μονάδες CSS. Στο Wayland δείχνει όλες τις περιπτώσεις, γιατί εκεί το πόσα pixel ζωγραφίζονται εξαρτάται από την εφαρμογή: μια εφαρμογή Wayland με κλασματική κλιμάκωση ζωγραφίζει τα pixel του πάνελ, μια εφαρμογή X11 μέσω XWayland λιγότερα, και το GNOME τα μεγεθύνει (θολά).
  • effective-dpi-calibrate ανοίγει ένα παράθυρο με το περίγραμμα μιας τραπεζικής κάρτας στο μέγεθος που προβλέπει το EDID. Ακουμπάς την κάρτα, μεγαλώνεις ή μικραίνεις το περίγραμμα μέχρι να ταιριάξει, και το αποθηκεύεις. Αποθηκεύεται μέγεθος σε χιλιοστά, όχι DPI, ώστε να ισχύει και όταν αλλάξει η κλίμακα ή η συνεδρία.

Η προτεραιότητα είναι: μέγεθος από το φύλλο προδιαγραφών (--size-mm), αλλιώς βαθμονόμηση με κάρτα, αλλιώς EDID, και η έξοδος λέει πάντα ποιο χρησιμοποίησε. Για την LG, μετά τη βαθμονόμηση:

HDMI-2  LG IPS FULLHD  [primary]
  physical size   523.7 × 294.6 mm  (23.6″ diagonal, card calibration 2026-10-18)
  EDID size       480 × 270 mm  (with it: 101.6 dpi)
  ...
  ⚠ with the EDID size everything would come out 9.1% too large: the EDID is wrong for this monitor

Οι δύο δρόμοι, η κάρτα στον φυλλομετρητή και το EDID με τη ζωγραφισμένη επιφάνεια στο λειτουργικό, είναι ανεξάρτητες μετρήσεις του ίδιου νούμερου, άρα ο ένας ελέγχει τον άλλο. Ο πιο απλός έλεγχος: το screen.width × devicePixelRatio στον φυλλομετρητή πρέπει να ισούται με τη ζωγραφισμένη επιφάνεια που δίνει το εργαλείο.

Φωτογραφίες και PDF: η κλίμακα πρέπει να είναι γνωστή

Μέχρι εδώ μιλούσα σαν το αρχείο που δείχνουμε να περιέχει ήδη τη σωστή κλίμακα. Αυτό δεν ισχύει από μόνο του. Για να βγει ένα έγγραφο 10 cm στην οθόνη 10 cm, πρέπει να ξέρουμε και πόσα pixel του αρχείου αντιστοιχούν στα 10 cm του πρωτοτύπου. Αν το πρωτότυπο είναι μέσα σε φωτογραφία ή PDF, αυτή είναι μια δεύτερη, ανεξάρτητη βαθμονόμηση.

πρωτότυπο → pixel του αρχείου → pixel της CSS → ζωγραφισμένα pixel → εκατοστά στην οθόνη

Για παρουσίαση 1:1 πρέπει να είναι γνωστή κάθε αντιστοίχιση της αλυσίδας.

Μια φωτογραφία raster έχει ένα αδιαμφισβήτητο μέγεθος: πλάτος και ύψος σε pixel. Συχνά έχει και πεδία ανάλυσης, συνήθως XResolution, YResolution και ResolutionUnit σε JPEG/TIFF ή το αντίστοιχο pHYs σε PNG. Αυτά δηλώνουν πόσα pixel ανά ίντσα (PPI, συχνά αλλά χαλαρά αποκαλούμενα DPI) προορίζονται για την αναπαραγωγή της εικόνας. Για παράδειγμα, 3000 pixel σε 300 PPI αντιστοιχούν σε πλάτος 10 ιντσών.

Τα πεδία αυτά όμως δεν αποδεικνύουν το μέγεθος του αντικειμένου που απεικονίζει η φωτογραφία. Μια φωτογραφία ενός νομίσματος μπορεί να δηλώνει 300 PPI είτε το νόμισμα έχει διάμετρο 2 cm είτε 20 cm. Για ένα σκαναρισμένο έγγραφο, η σχέση γίνεται αξιόπιστη μόνο αν είναι γνωστή η κλίμακα της σάρωσης ή αν υπάρχει μέσα στην εικόνα ένας χάρακας ή άλλο αντικείμενο γνωστού μεγέθους. Ένα πρωτότυπο 10 cm σκαναρισμένο στα 300 PPI, για παράδειγμα, έχει περίπου 1181 pixel κατά πλάτος.

Και αυτά τα πεδία μπορούν να αλλάξουν εκ των υστέρων χωρίς να αλλάξει ούτε ένα pixel. Αν μια εικόνα 3000 pixel δηλωθεί ως 150 αντί για 300 PPI, το προτεινόμενο πλάτος της αλλάζει από 10 σε 20 ίντσες, αλλά δεν αποκτά περισσότερη λεπτομέρεια ούτε το εικονιζόμενο αντικείμενο γίνεται μεγαλύτερο. Γι’ αυτό το PPI είναι χρήσιμη οδηγία παρουσίασης ή εκτύπωσης, όχι τεκμήριο της κλίμακας του πρωτοτύπου.

Το PDF είναι διαφορετικό: δεν είναι κατ’ ανάγκη εικόνα αλλά περιγραφή μιας σελίδας, που μπορεί να περιέχει κείμενο, διανυσματικά σχέδια και raster εικόνες. Το φυσικό μέγεθος της σελίδας ορίζεται από το πλαίσιό της (MediaBox), σε μονάδες του PDF, που εξ ορισμού είναι 1/72 της ίντσας· μια ενσωματωμένη raster εικόνα έχει pixel, αλλά το μέγεθος με το οποίο τοποθετείται στη σελίδα ορίζεται από τον μετασχηματισμό της. Επομένως δεν υπάρχει ένα ενιαίο «DPI του PDF»: η ίδια εικόνα 3000 pixel μπορεί να τοποθετηθεί σε πλάτος 10 ιντσών (300 PPI) ή 15 ιντσών (200 PPI).

Και εδώ, όπως με το PPI, μέγεθος σελίδας και τοποθέτηση αλλάζουν εκ των υστέρων. Για παρουσίαση 1:1, λοιπόν, το PDF ή η εικόνα πρέπει να συνοδεύεται από αξιόπιστη πληροφορία για την κλίμακα του πρωτοτύπου. Έπειτα η σελίδα του web χρησιμοποιεί αυτή τη σχέση pixel–πρωτοτύπου μαζί με τη βαθμονόμηση της οθόνης που περιέγραψα παραπάνω. Χωρίς ρητή CSS, ο φυλλομετρητής δείχνει κατά κανόνα ένα pixel της εικόνας ως ένα pixel της CSS. Το HTML Standard προβλέπει και την περίπτωση που διαβάζει το PPI από το EXIF, αλλά το μετράει ως προς τα 72: μια εικόνα 144 PPI βγαίνει στο μισό μέγεθος σε pixel της CSS. Ούτε έτσι λοιπόν το PPI της εικόνας εγγυάται φυσικό μέγεθος.

Γιατί δεν το έχει λύσει κανείς

Τρεις λόγοι, που αθροίζονται:

  • Το χρειάζονται λίγοι, και έχουν άλλες λύσεις. Οι περισσότεροι θέλουν το κείμενο ευανάγνωστο, όχι ακριβές. Τα λειτουργικά και η CSS διάλεξαν σκόπιμα το «άνετο μέγεθος»: ένα γράμμα πρέπει να φαίνεται ίδιο στο κινητό και στην τηλεόραση στην άλλη άκρη του δωματίου, άρα το φυσικό του μέγεθος πρέπει να διαφέρει. Όπου μετράει το πραγματικό μέγεθος, ο κόσμος τυπώνει. Το χαρτί είναι το μέσο όπου το πρόβλημα έχει λυθεί.
  • Κανείς δεν κατέχει όλη την αλυσίδα. Για ένα σωστό νούμερο χρειάζονται πέντε κρίκοι με διαφορετικό ιδιοκτήτη ο καθένας: κατασκευαστής της οθόνης (EDID) → οδηγός → compositor (κλιμάκωση) → toolkit → εφαρμογή ή φυλλομετρητής. Ο κατασκευαστής δεν έχει λόγο να γράψει 527 αντί για 480, γιατί τίποτα δεν το ελέγχει.
  • Στο web, η ιδιωτικότητα κλείνει την πόρτα. Ακόμα κι αν όλοι οι κρίκοι ήταν σωστοί, ο φυλλομετρητής δεν θα απεικόνιζε το φυσικό μέγεθος στη σελίδα.

Στο τέλος απομένει η μία μέτρηση που κανένα API δεν μπορεί να μαντέψει ή να διαρρεύσει: ο αναγνώστης συγκρίνει στην ίδια την οθόνη με ένα αληθινό αντικείμενο γνωστού μεγέθους. Γι’ αυτό τα site που χρειάζονται πραγματικό μέγεθος ζητούν μια τραπεζική κάρτα, και γι’ αυτό, όπως έδειξε η LG, ακόμα και το Linux χρειάζεται μία φορά βαθμονόμηση για να ξέρει σωστά. Το 1:1 στην οθόνη δεν είναι ιδιότητα ούτε του αρχείου ούτε της CSS από μόνα τους· προκύπτει μόνο όταν η κλίμακα του πρωτοτύπου αντιστοιχιστεί, με βαθμονομημένη οθόνη, στα pixel που τελικά ζωγραφίζονται.

Πηγές