2012-08-31 8 views
0

Disons que j'ai une image représentée par un CFMutableBitVector. Cela signifie que 0 bit représente un pixel éteint et que 1 bit représente un pixel sur. Y a-t-il un moyen de convertir facilement et rapidement ce CFMutableBitVector en un tableau de bas niveau d'ints où un bit de sortie représente un entier sur tout un bit, et un bit de sortie représente un entier tout entier ?Objective-C CFMutableBitVector à ints

Le CFMutableBitVector [0,0,0,1,1,0,1,0];

se traduirait par:

int[8] = 
[ 
    00000000000000000000000000000000, 
    00000000000000000000000000000000, 
    00000000000000000000000000000000, 
    11111111111111111111111111111111, 
    11111111111111111111111111111111, 
    00000000000000000000000000000000, 
    11111111111111111111111111111111, 
    00000000000000000000000000000000, 
]; 

Maintenant, ce qui est une image à partir d'un flux vidéo, ce devra se produire très rapidement - Quel est le moyen le plus rapide de faire une telle conversion en Objective-C?

Répondre

2

est ici la conversion de l'échantillon ...

u_int32_t sample = UINT32_MAX; 
    CFBitVectorRef bv = CFBitVectorCreate(NULL, (const u_int8_t *)&sample, sizeof(u_int32_t) * 8); 

    CFIndex bitCount = CFBitVectorGetCount(bv); 
    u_int32_t *a = malloc(bitCount * sizeof(u_int32_t)); 
    for (CFIndex i = 0 ; i < bitCount ; i++) { 
    a[i] = CFBitVectorGetBitAtIndex(bv, i) * UINT32_MAX; 
    } 

    for (int i = 0 ; i < bitCount ; i++) { 
    NSLog(@"Index: %d Number: %u", i, a[i]); 
    } 
    free(a); 
+0

Puis-je demander, pourquoi l'utilisation de u_int32_t? Est-ce pour s'assurer que tous les compilateurs utilisent la même taille d'int ...? –

+0

Parce que vous vouliez un ensemble de 32 bits dans votre exemple et 'u_int32_t' vous garantit un int 32 bits non signé. N'hésitez pas à changer «UINT32_MAX» et «u_int32_t» pour tout ce qui convient mieux à vos besoins. – robertvojta

+0

Oh non, ça fait parfaitement, je me demandais juste! –