2010-06-02 5 views
3

Objective-C/Cocoa: J'ai besoin de charger l'image à partir d'un fichier JPG dans un tableau bidimensionnel afin que je puisse accéder à chaque pixel. J'essaie (sans succès) de charger l'image dans un NSBitmapImageRep. J'ai essayé plusieurs variations sur les deux lignes de code suivantes:Comment charger le fichier JPG dans NSBitmapImageRep?

NSString *filePath = [NSString stringWithFormat: @"%@%@",@"/Users/adam/Documents/phoneimages/", [outLabel stringValue]]; //this coming from a window control 
NSImageRep *controlBitmap = [[NSImageRep alloc] imageRepWithContentsOfFile:filePath]; 

Avec le code ci, je reçois une erreur d'exécution: - [NSImageRep imageRepWithContentsOfFile:]: sélecteur non reconnu envoyé à l'instance 0x100147070.

J'ai essayé de remplacer la deuxième ligne de code avec:

NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath]; 
NSBitmapImageRep *controlBitmap = [[NSBitmapImageRep alloc] initWithData:controlImage]; 

Mais cela donne une erreur de compilateur de type incompatible "en disant que initWithData veut une variable NSData pas NSImage.

J'ai également essayé d'autres manières d'y arriver, mais toutes ont échoué en raison d'une erreur de compilateur ou d'exécution. Quelqu'un peut il m'aider avec ça? Je devrai éventuellement charger certains fichiers PNG de la même manière (donc ce serait bien d'avoir une technique cohérente pour les deux).

Et si vous connaissez un moyen plus simple/plus simple d'accomplir ce que j'essaie de faire (à savoir, placer les images dans un tableau à deux dimensions), plutôt que d'utiliser NSBitmapImageRep, faites-le moi savoir! Et en passant, je sais que le chemin est valide (confirmé avec fileExistsAtPath) - et le nom de fichier dans outLabel est un fichier avec l'extension .jpg.

Merci pour toute aide!

Répondre

7

Facile!

NSImage *controlImage = [[NSImage alloc] initWithContentsOfFile:filePath]; 
NSBitmapImageRep *imageRep = [[controlImage representations] objectAtIndex:0]; 

ensuite pour obtenir les données de pixel bitmap réelle:

unsigned char *pixelData = [imageRep bitmapData]; 

Si votre image a plusieurs représentations (il ne probablement pas), vous pouvez les sortir de ce même tableau. Le même code fonctionnera pour vos images .png.

+0

Merci beaucoup! Cela ramène les données dans un tableau sur lequel je peux travailler. – Adam

1

Editer:

Carl a une meilleure réponse. Cela n'est utile que si vous souhaitez également manipuler l'image d'une manière ou d'une autre, comme la mise à l'échelle ou le changement de mode couleur.

Original:

Je probablement utiliser des graphiques de base pour cela. NSImage et la plupart NSImageRep n'ont pas été conçus pour avoir une matrice de pixels assis autour. Ils convertissent les données d'image source en pixels uniquement lorsqu'ils sont dessinés. Lorsque vous créez un CGBitmapContext, vous pouvez lui transmettre un tampon de pixels à utiliser. C'est votre tableau à deux dimensions, avec les octets de ligne, la profondeur de couleur, le format de pixel et les autres propriétés que vous spécifiez.

Vous pouvez initialiser une image CGImage avec des données JPG ou PNG en utilisant respectivement CGImageCreateWithJPEGDataProvider ou CGImageCreateWithPNGDataProvider. Une fois que vous dessinez l'image dans le contexte avec CGContextDrawImage, le tampon d'origine que vous avez passé à CGBitmapContextCreate est maintenant rempli avec les données de pixel de l'image.

  1. Créez un objet CGDataProvider avec les données d'image.
  2. Créez un CGImageRef avec le fournisseur de données.
  3. Créez un tampon suffisamment grand pour les pixels de l'image.
  4. Créez un CGBitmapContext correspondant à la taille de l'image avec le tampon de pixels.
  5. Dessinez l'image dans le contexte bitmap.
  6. Accédez aux pixels dans le tampon.

Si vous souhaitez utiliser NSImage au lieu de CGImage, vous pouvez créer un NSGraphicsContext d'un CGContext avec graphicsContextWithGraphicsPort: basculée: et le définir comme le contexte actuel. Cela remplace fondamentalement les étapes 1 et 2 ci-dessus avec le code que vous voulez utiliser pour créer un NSImage.

1

imageRepWithContentsOfFile est une fonction statique

bonne façon de l'utiliser:

[NSBitmapImageRep imageRepWithContentsOfFile:filePath]; 
Questions connexes