CGRect, CGPoint, CGSize : pt ? pt <-> cm ? @2x ?

Bonjour !


 


Comme posé ici sur SO (et sans réponse), je me demande quelle est la dimension d'un CGPoint.


Je me demande aussi comment faire la conversion depuis/vers les cm et si les facteurs de conversions sont absolus ou s'ils dépendent du device (retina, pas retina...)


 


Voilà  ce que j'ai trouvé :



    NSURL * URLDoc = [[NSBundle mainBundle] URLForResource:@file
                                             withExtension:@pdf] ;
    
    PDFDocument * document = [[PDFDocument alloc] initWithURL:URLDoc] ;
    
    PDFPage * page = [document pageAtIndex:0] ;
    
    CGRect rect = [page boundsForBox:kPDFDisplayBoxMediaBox] ;

`p rect` dans le debugger me renvoie 


 


(CGRect) $3 = origin=(x=0, y=0) size=(width=283.46500000000003, height=113.386)


 


pour un PDF dont les dimension sont 10cm*4cm.


 


Je trouve donc un taux de conversion : 1cm = 28.3465 unité "CG". Quand je googleise ce nombre, je ne tombe que sur des pages relatives à  Apple... Serait-ce donc une unité propre à  Apple ?


 


Si vous des liens à  me donner ou des réponses, ça m'aiderait à  me sentir plus sûr pour comprendre les unités de CGPoint, etc. et comment elles se convertissent en cm.


 


Merci


Colas

Réponses

  • LarmeLarme Membre

    Euh, CGPoint, c'est en pixel... Mais ça peut aussi potentiellement dépendre du zoom (en bref, c'est en pixel mais avec quelle référence pour le CGPointZero), et après, il s'agit d'un peu de DPI ?


  • CéroceCéroce Membre, Modérateur
    juin 2014 modifié #3
    Tant qu'on dessine à  l'écran:

    - Sur un écran non-Retina, les unités CGFloat sont égales à  des pixels,
    - Sur un écran Retina, ça dépend... quand on choisit le réglage "Optimisé pour l'écran", on a 2 pixels par CGFloats. Autrement, ça peut être entre 1 et 2.

    Même dans le cas 1), on a un problème pour convertir en unités physiques, parce que ça dépend de la résolution de l'écran.

    Exemple, mon écran à  un résolution de 100 dpi, quelle doit être la longueur d'une ligne pour qu'elle mesure 10 cm à  l'écran ?
    100 dpi = 100 points / pouce = 39,37 points/cm
    Il faut donc tracer une ligne de 393,7 pixels.

    Le premier souci est de savoir quelle est la résolution de l'écran. Longtemps, nous n'avions aucun moyen de le savoir, et il fallait dessiner à  72 dpi. Je n'ai pas trop suivi ce qu'Apple a fait ces derniers temps, mais j'ai l'impression qu'ils ont enfin ajouté des API.

    Ensuite, il faut bien comprendre qu'on peut appliquer des matrices de transformation, dans ce cas les dimensions du CGFloat varient en fonction de la matrice.
  • colas_colas_ Membre
    juin 2014 modifié #4

    Donc le code (osx) que j'ai donné donnerait une autre valeur sur un mac book pro retina ?


    À mon avis, cela dépend des API de QuartzPDF.


     


    En fait, mon but initial est de retrouver la taille (en cm) d'un pdf !


     


    Merci de vos contributions !


  • CéroceCéroce Membre, Modérateur
    juin 2014 modifié #5
    Non, il renverrait sans doute le même CGRect. Ce n'est pas une unité physique comme le mètre ou le pouce.
  • Pour donner plus de précision, 1cm <-> 28.3465 unité "CG" correspond exactement à  72 pixels par pouce !!! Cool de retomber sur ses pattes ;-)


     


    Lu sur cette page :  the bounds returned for PDF display boxes are in page space which is defined by the PDF file format, and is not going to change due to resolution independence on any particular implementation.


  • AliGatorAliGator Membre, Modérateur
    La dimension d'un PDF est en points, comme tout ce qui est manipulé avec des CGPoint et CGSize & co.

    Pour convertir cette dimension en cm, il faut connaà®tre la résolution à  laquelle est enregistré le PDF (soit c'est encodé qqpart dans le fichier PDF, soit le standard PDF a imposé à  tout le monde de respecter une résolution donnée, ça j'en sais rien j'ai pas assez fait joujou avec les PDFs).

    C'est comme quand tu ouvres un JPG dans Aperçu. Ta question reviens à  dire "je veux connaà®tre la dimension de l'image en cm". Bah il faut connaà®tre à  la fois la dimension en pixels et la résolution (en pixels par cm ou plus souvent en pixels par pouce (ou "points per inch" ou "dots per inch" en VO, soit DPI pour les intimes) pour pouvoir appliquer une simple règle de 2 dessus ensuite.

    ---

    Si tu ouvres un JPG avec Aperçu et que du demandes ses informations, il t'indique les dimensions du JPG en pixels... et sa résolution (souvent 72dpi mais pas toujours).
    Si tu ouvres un PDF avec Aperçu c'est vrai qu'il n'affiche pas un tel chiffre concernant la résolution. Mais il permet de t'afficher la taille en Points (j'ai un exemple là  d'un PDF qui fait 595x842 points) ou en Pouces (8,27x11,7 pouces) ou en Cm (21x29,7 cm). Or si tu fais le calcul, 595/8,27 = 842/11,7 ≈ 72 dpi

    Et comme le souligne colas2 tu es aussi dans ce cas avec ton exemple puisque tu as 28,3465 points/cm ce qui correspond exactement à  72 points/pouce (1 pouce = 2,54cm et 28,3465*2,54=72)
  • Super réponse... Comme d'habitude !
Connectez-vous ou Inscrivez-vous pour répondre.