[Résolu] UIImage resizing

iLandesiLandes Membre
septembre 2016 modifié dans Objective-C, Swift, C, C++ #1

Je m'arrache les cheveux. Pourquoi je n'obtient pas la même taille quand je vais



// Resizing Image
let size = CGSizeMake(rect.size.width, rect.size.height)
print (size)
UIGraphicsBeginImageContextWithOptions(size, false, 1)
_image.drawInRect(rect)
let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
print(resizedImage.size)

La console me donne



(18.5, 18.5)
(19.0, 19.0)

Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur
    septembre 2016 modifié #2

    Sans en être sûr, je pense qu'un contexte graphique doit avoir une taille entière.


    Quoiqu'en Retina, j'aurais pensé que les multiples de 0.5 passaient...




  • Sans en être sûr, je pense qu'un contexte graphique doit avoir une taille entière.




    Je pense la même chose.

  • Et donc ?


  • Bah, j'suis pas sûr qu'une image ait l'droit d'avoir une taille en pixel non entier.


    Après, je me demande si en faisait UIGraphicsBeginImageContextWithOptions(size, false, 2), tu as bien 18,5*2 et non pas 19*2.


  • Effectivement le resizing d'une image ne se fait qu'avec des valeurs entières. L'usage d'un CGFloat comme un entier me perturbe mais bon j'ai arrondi mes valeurs


  • Une image bitmap stockée en mémoire a forcément une taille entière, de n*n pixels. A la différence de sa représentation graphique sur l'écran, qui peut être (par exemple) de 100,7654*65,3287 points. On a tendance à  penser bitmap 2D en regardant l'écran de l'iPhone, mais en réalité l'affichage se fait en utilisant les fonctions d'accélérations 3D de la puce graphique. Sous le capot une UIImage n'est qu'une texture bitmap.

  • Ce n'est pas toujours très clair cette histoire de points et de pixel. On ne sait pas bien quand est-ce que l'on parle de point et quand est-ce qu'on parle de pixel. Surtout qu'encore une fois le type CGFloat est loin de faire penser à  une valeur entière qui pour moi serait plutôt un CGInt.


  • On parle toujours de points, jamais de pixels.




  • On parle toujours de points, jamais de pixels.




    C'est bien pour cela que je ne comprend que l'image resizing ne soit pas possible avec une valeur décimale  ;D

  • C'est une fonction attendue pour iOS 11  ;D


  • On parle de points uniquement pour la représentation physique d'un objet sur l'écran. Toutes les manipulations en mémoire se font avec des pixels. Les API de traitement graphique CGTruc et compagnie existaient bien avant qu'Apple ne commence à  réfléchir à  un système fournissant le même rendu graphique pour différentes résolutions.


     


    On peut faire un image resizing avec une valeur décimale, à  condition que la taille de l'image finale posséde un nombre entier de pixels.


     


    Exemple avec une image de 512x512 pixels :


      - facteur de multiplication de 0.75 => 384x384 pixels


      - facteur de multiplication de 0.5 => 256x256 pixels


      - facteur de multiplication de 0.25 => 128x128 pixels


      - facteur de multiplication de 1.5 => 768x768 pixels


     


    Si le facteur de resize décimal ne colle pas, il faut le modifier légèrement pour arriver à  un nombre entier de pixels.


    Exemple : 512 pixels * 0.3 => 153,6 pixels . Pas bon !


    J'ajuste la taille de l'image à  154 pixels pour calculer un nouveau facteur de resize.


    154/512 = 0,30078125


    512*0,30078128 = 154 pixels ! C'est tout good !

Connectez-vous ou Inscrivez-vous pour répondre.