[Renoncé] Pixels d'une image
berfis
Membre
Bonsoir,
Rien à faire pour lire les pixels d'une image 64x64 comme celle de la pièce jointe. J'ai essayé l'exemple de Mala sans succès.
Je me doute que je dois traiter un vecteur de pixels de 64x64 (4096 positions) mais comment le "lire" de façon à savoir si le pixel est noir (ou non-transparent éventuellement) ?
Essai:
NSString *imgPath = [[NSBundle mainBundle] pathForImageResource:@HWalls];
NSData *data = [NSData dataWithContentsOfFile:imgPath];
NSBitmapImageRep* bitmapImageRepOri = [NSBitmapImageRep imageRepWithData:data];
unsigned char *pixPtrOri = (unsigned char *)[bitmapImageRepOri bitmapData];
long bufferLength = [bitmapImageRepOri pixelsHigh]*[bitmapImageRepOri pixelsWide];
int pix = 0;
while( pix<bufferLength )
{
NSLog(@%d = %d,pix, pixPtrOri[pix+3]);
pix=pix+4;
}
Tentative infructueuse. Pourriez-vous me souffler la réponse?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mon exemple est basé sur une image N&B sans couche alpha et avec une taille de 2028 pixels pour avoir un alignement optimal (la largeur d'une NSBitmapImageRep peut être plus grande que la taille de l'image pour des raisons d'optimisation des performances pour certains traitement.).
Donc première étape déterminer l'agencement des pixels de ton image. Un NSLog sur la descritpion de ta bitmapImageRepOri cela te donne quoi?
Bonjour Mala,
ça me donne ça:
2014-06-18 23:45:41.606 Labyrinthe[20275:303] NSBitmapImageRep 0x6000000ba400 Size={64, 64} ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) Pixels=64x64 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil (faulting) CGImageSource=0x6000001636c0
Bon j'ai laissé tomber, c'était une fausse bonne idée. Si la lecture des pixels et la création des murs est triviale pour la partie horizontale, elle devient franchement alambiquée pour la création des murs verticaux.
J'ai mis les coordonnées de départ, la longueur et le sens (horizontal/vertical) dans une plist, ça prend 7K (moins que les deux images) et c'est plus rapide. ça m'apprendra à coller aux exemples d'Apple...
ça reste intuitif à éditer, et relativement facile à parser.
Désolé, je suis pas souvent connecté à Internet en ce moment.
Si je reste sur la question de départ, ton code il sensé faire quoi exactement? Ce que je constate:
- tu passes tes pixels 3 par trois (cf pixPtrOri[pix+3]) alors que tu n'as qu'une compostante noir & blanc.
- et derrière tu fais "pix=pix+4;" Ok. Pourquoi pas, mais ça n'avance à rien on est bien d'accord? Car pas de couche alpha non plus...
Heu, non. Plus simple je veux bien mais plus rapide j'en doute... Fais grimper la taille de ton labyrinthe un peu. On va rire.
Au passage, quel intérêt d'utiliser deux buffers pour les murs horizontaux et verticaux?
Dans mon exemple je travaille sur une manipulation de pixels où je n'ai pas à me soucier de l'espace 2D. Je parcours donc mon image comme un buffer 1D. Dans ton cas, tu dois juste extrapoler tes coordonnées X/Y pour ton labyrinthe 2D. Donc cela donnerait quelque chose du genre:
Ce ne serait sans doute pas une grande difficulté si je créais une sprite par pixel. Mais j'aurais voulu limiter le nombre d'objets, surtout si ce sont des murs inertes.
Donc il me faudrait faire une sorte d'automate qui "débuterait" un rectangle et le "terminerait", du genre (pseudocode):
si (pixel noir)
si (rectangle == NON)
rectangle = OUI
débuter rectangle
sinon
si (rectangle == OUI)
créer rectangle
rectangle = NON
...