Pointeurs et Représentation Bitmap

ElenaherElenaher Membre
04:21 modifié dans API AppKit #1
Hello,

Je suis encore un débutant en programmation et j'ai un petit problème qui m'embête beaucoup mais qui risque de sembler hyper simple à  des programmeurs experimentés :
Je dispose de deux NSBitmapImageRep ( RepBitmap1 et RepBitmap2 ) de même taille. J'ai un pointeur p qui pointe sur un pixel de la première représentation et je souhaiterais modifier le pixel correspondant de la deuxième représentation.
De manière formelle je souhaiterais faire un truc du genre
p' = p - [RepBitmap1  bitmapData] + [RepBitmap2  bitmapData]
puis modifier à  ma guise *p'

Quelqun aurait il une idée ?

Thx d'avance.

Réponses

  • BruBru Membre
    04:21 modifié #2
    Plutôt que d'accéder aux plans binaires directement, je te conseille d'utiliser les méthodes getPixel:atX:y: et setPixel:atX:y: de NSBitmapImageRep.
    Ca te permettra de lire la donnée binaire d'un pixel en x,y du premier imageRep (voire du second), d'y appliquer ton trairement, et enfin de la mettre dans le second imageRep aux mêmes coordonnées x,y.

    .
  • ElenaherElenaher Membre
    octobre 2006 modifié #3
    Thx pour ta réponse, je pense que tu as raison.
    Je vais réecrire la fin de mon programme en me basant sur ca. Le seul problème c'est que je n'arrive pas à  voir quel type de valeur il faut que je mette après setPixel...
    Je pensais mettre un int[1][1] comme j'ai une image en 8 bits gris...
    Je dois avouer que je suis un newbie dans ce genre de truc et je ne trouve aucun exemple de code sur internet qui puisse m'aider  :-\\ :-\\
    Je commence un peu à  en avoir marre... je passe des heures sur des problèmes de syntaxes tout bêtes...
  • BruBru Membre
    04:21 modifié #4
    Bouh, y'a rien de complexe dans ces méthodes, puisques elles utilisent la syntaxe C.

    Le premier argument (unsigned int[])pixelData signifie que tu dois passer en paramètre un tableau de unsigned int. Ce tableau se déclare comme suit :
    [tt]unsigned int pixelData[16];[/tt]
    Ici, un tableau de 16 unsigned int est créé (cette taille est fictive).

    getPixel va remplir ce tableau (ou du moins une partie de ce tableau) avec les données correspondant à  la couleur de 1 pixel. C'est le contenu de ce tableau que tu vas traiter puis remettre dans le bitmatRep via setPixel.

    Maintenant, que doit-on utiliser comme taille de tableau pour getPixel/setPixel ?
    C'est un vaste sujet.
    La plupart des formats d'image, sans couche alpha, se contente de 3 octets (un R, un V et un B), donc un tableau de 3 unsigned int est suffisant.

    Voici un exemple :
    <br />{<br />&nbsp; &nbsp; unsigned int pixelData[3];<br /><br />&nbsp; &nbsp; [rep getPixel:pixelData atX:0 y:0];<br />&nbsp; &nbsp; pixelData[1]=pixelData[1)+50;<br />&nbsp; &nbsp; [rep setPixel:pixelData atX:0 y:0];<br />}<br />
    

    Dans cette exemple, je lis le pixel en 0,0, puis j'augmente la seconde composante ([1] qui est le vert) de 50 pour remettre cette valeur dans la représentation.
    Le résultat est donc d'augmenter le vert dans ce pixel.

    .
  • ElenaherElenaher Membre
    04:21 modifié #5
    Thx pour ton aide...

    En fait je ne sais pas pourquoi je me suis mis dans la tête de mettre un tableau bi-dimensionnel mais en fait ca n'a aucun sens... C'est si simple en fait... Je devais vraiment être crevé...

    Merci encore...
  • MalaMala Membre, Modérateur
    04:21 modifié #6

    En fait je ne sais pas pourquoi je me suis mis dans la tête de mettre un tableau bi-dimensionnel mais en fait ca n'a aucun sens...

    Non, bien au contraire c'est complètement sensé. Travailler directement sur les matrices de pixels permet de gagner énormément par rapport à  l'usage de getPixel et setPixel.
    Si on a besoin de travailler uniquement sur quelques pixels (ex: évaluer la valeur du pixels lors du survol du curseur) là  pas de problème. Mais si on a besoin d'appliquer un filtre sur l'ensemble de l'image là  c'est une autre histoire. L'exemple de Bruz extrapolé à  une simple image en 640x480 c'est déjà  plus de 600000 appels de méthodes entre le getPixel et le setPixel. Cela ajouté au fait qu'obj-c, de par son côté très dynamique, est assez lent lors des appels de méthodes, on comprend aisément qu'accéder directement à  la matrice donnera des résultats beaucoup plus performants.
  • WIMPWIMP Membre
    04:21 modifié #7
    Pour se familiariser avec plusieurs façons d'adresser les pixels dans NSBitmapImageRep, un exemple très instructifs peut être téléchargé sur www.cocoaprogramming.net, chapitre 13, programme "points".
    On y décrit plusieurs méthodes, avec larges commentaires (en anglais), et discussion sur les vitesses d'execution respectives.
    Je m'en étais servi pour écrire mon programme Fractales.
Connectez-vous ou Inscrivez-vous pour répondre.