Affichage d'une portion d'image

DrakenDraken Membre
juin 2009 modifié dans API UIKit #1
La méthode draw de la classe UIImage dessine une image sur un contexte graphique. Parfait, mais comment faire pour ne dessiner qu'une partie de l'image ?

J'ai une UIImage contenant une police de caractères bitmaps, que je comptais pour utiliser pour dessiner des caractères sur l'écran. Mais je ne trouve pas la manière d'afficher juste une portion de l'image.

Y a-t-il une méthode pour transférer une portion d'images ? Avec un paramètre définissant le rectangle de pixels à  afficher.

Dans le genre :

<br />// draw image, rectangleOrigine, positionDestination<br />


ou encore

<br />// draw image, rectangeOrigine, rectangleDestination<br />



EDIT :

J'ai vu qu'il y avait une méthode permettant de découper une portion d'image. Mais je préfère ne pas l'utiliser, ne voulant pas perdre de la place en dédoublant mes données bitmaps en mémoire.

<br />CGImageRef CGImageCreateWithImageInRect (<br />&nbsp;  CGImageRef image,<br />&nbsp;  CGRect rect<br />);<br />


Réponses

  • Philippe49Philippe49 Membre
    23:28 modifié #2
    [UIColor colorWithPatternImage:myImage] est une solution peu coûteuse.
  • DrakenDraken Membre
    23:28 modifié #3
    Et ça s'utilise comment ?

  • DrakenDraken Membre
    juin 2009 modifié #4
    Bon c'est agaçant cette histoire. J'étais persuadé qu'il était possible de copier une portion d'image en Cocoa. Et effectivement je l'avais lu dans l'ouvrage "Programmation Cocoa sous Mac OSX", dans un exemple page 254, avec la méthode drawInRect.

    Hélas, la méthode drawInRect de l'OS iPhone a été simplifiée, ne permettant plus de définir un rectangle d'origine pour l'affichage des pixels. C'est bien dommage. Snif..

  • Philippe49Philippe49 Membre
    23:28 modifié #5
    dans 1244832752:

    Et ça s'utilise comment ?


    comme cela :
    - (void)drawRect:(CGRect)rect {<br /><br />&nbsp; &nbsp; // Drawing code<br />	CGContextRef context=UIGraphicsGetCurrentContext();<br />	CGMutablePathRef path=CGPathCreateMutable();<br />	CGPathMoveToPoint(path, NULL, CGRectGetMidX(rect), CGRectGetMidY(rect));<br />	CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMidY(rect));<br />	CGPathAddArc(path, NULL, CGRectGetMidX(rect), CGRectGetMidY(rect), CGRectGetWidth(rect)/2., 0., 5., NO);<br />	CGPathAddLineToPoint(path, NULL, CGRectGetMidX(rect), CGRectGetMidY(rect));<br />	CGPathCloseSubpath(path);<br />	CGContextAddPath(context, path);<br /><br />	<br />	UIImage * image=[UIImage imageNamed:@&quot;im06.png&quot;];<br />	UIColor * patternColor=[UIColor colorWithPatternImage:image];<br />	[patternColor set];<br />	CGContextFillPath(context);<br />}<br />
    

  • DrakenDraken Membre
    23:28 modifié #6
    Merci Phillippe49. C'est intéressant. Je note le principe. Mais cela ne répond pas à  mon besoin premier, stocker une collection de petits éléments graphiques dans une image, et les afficher très rapidement à  la demande. C'est pour un jeu vidéo, ce qui pose des contraintes particulières de performances.

    Je vais peut être me pencher vers OpenGL. Il semble y avoir des fonctions sympathiques pour afficher des textures 2D.

  • Philippe49Philippe49 Membre
    23:28 modifié #7
    dans 1244889416:

    Mais cela ne répond pas à  mon besoin premier, stocker une collection de petits éléments graphiques dans une image, et les afficher très rapidement à  la demande. C'est pour un jeu vidéo, ce qui pose des contraintes particulières de performances.

    Je vais peut être me pencher vers OpenGL. Il semble y avoir des fonctions sympathiques pour afficher des textures 2D.


    Soit tu stockes autant d'images que de "petits éléments graphiques"
    Soit tu utilises une texture, c'est-à -dire exactement ce que fait colorWithPatternImage:
  • DrakenDraken Membre
    23:28 modifié #8
    J'ai bien pensé à  utiliser des tas de petites images pour stocker mes éléments, mais l'idée d'avoir 300 à  400 images en mémoire me gène. Sans parler du temps nécessaire au chargement des données pour générer les petits images, à  partir d'une seule image.

    A moins de pré-découper les images, mais alors je vais me retrouver avec quelques centaines de petites images (32x32 pixels). Pas facile à  gérer, surtout en cas de modification d'une planche graphique.

    Il reste encore la solution de découper les images à  la volée, ce qui risque de ralentir considérablement le processeur. Surtout dans un jeu vidéo où l'écran est redessiné plusieurs dizaines de fois par seconde.

  • LastikoLastiko Membre
    23:28 modifié #9
    y a peut etre une reponse la ( bien que ca ressemble a ce qu'a dit Philippe )

    http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-part-6_25.html
  • DrakenDraken Membre
    juin 2009 modifié #10
    Merci, cela vas m'être utile. Ton lien traite de l'utilisation des textures OpenGL. Je bosse justement sur la question depuis plusieurs jours, pour créer un petit moteur 2D basé sur OpenGL. Cela n'a pas grand chose à  voir avec CoreGraphics, et me parait plus approprié à  la création de jeux vidéo. 

    Le template "OpenGL Application" du SDK et les exemples du site d'Apple (GLSprite, GLPaint et GLGravity) sont intéressants.

    - animation à  60 images/s
    - Manipulation de textures dans tous les sens
    - Possibilité d'utiliser des textures compressées en mémoire !! (miam)
    - Evolution possible vers la 3D
    - Etc..

    Bref, que du bon.. Même si c'est plus complexe à  maà®triser que du CoreGraphics de base.

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