2010-03-07 6 views
1

J'ai un tableau qui contient les valeurs de couleur RVB pour chaque pixel dans un affichage de 320 x 180. Je voudrais être en mesure de définir des valeurs de pixels individuels dans le contexte d'un bitmap de la même taille hors écran puis afficher le contexte bitmap dans une vue.Utilisation du contenu d'un tableau pour définir des pixels individuels dans un contexte de bitmap Quartz

Il semble que je doive créer 1x1 rects et soit mettre un coup sur eux ou une ligne de longueur 1 au point en question. Est-ce exact? Je cherche un moyen très efficace d'obtenir les données de tableau sur le contexte graphique comme vous pouvez l'imaginer, il s'agira d'un tampon d'image qui tourne à 25 images par seconde et dessiner de cette façon semble inefficace.

Je suppose que l'autre question est de savoir si j'utilise OPENGL ES à la place?

Les pensées/bonnes pratiques seraient grandement appréciées.

Cordialement

Dave

OK, ont parcouru un court, mais ne peut pas faire le dernier obstacle et je ne sais pas pourquoi cela ne fonctionne pas:

- (void) displayContentsOfArray1UsingBitmap: (CGContextRef)context 
{ 
    long bitmapData[WIDTH * HEIGHT]; 

    // Build bitmap 
    int i, j, h; 
    for (i = 0; i < WIDTH; i++) 
    { 
     for (j = 0; j < HEIGHT; j++) 
     { 
     h = frameBuffer01[i][j]; 
     bitmapData[i * j] = h; 
     } 
} 
// Blit the bitmap to the context 
    CGDataProviderRef providerRef = CGDataProviderCreateWithData(NULL, bitmapData,4 * WIDTH * HEIGHT, NULL); 

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 

    CGImageRef imageRef = CGImageCreate(WIDTH, HEIGHT, 8, 32, WIDTH * 4, colorSpaceRef, kCGImageAlphaFirst, providerRef, NULL, YES, kCGRenderingIntentDefault); 

    CGContextDrawImage(context, CGRectMake(0.0, HEIGHT, WIDTH, HEIGHT), imageRef); 

    CGImageRelease(imageRef); 
    CGColorSpaceRelease(colorSpaceRef); 
    CGDataProviderRelease(providerRef); 
} 

Répondre

1

Lire la documentation pour CGImageCreate(). Fondamentalement, vous devez créer un CGDataProvider à partir de votre matrice de pixels (en utilisant CGDataProviderCreateDirect()), puis créer un CGImage avec ce fournisseur de données en tant que source. Vous pouvez ensuite dessiner l'image dans n'importe quel contexte. C'est un peu fastidieux de bien faire les choses car ces fonctions attendent beaucoup d'arguments, mais la documentation est assez bonne.

+0

Cheers Ole, allez-y. Dave. –

+0

Salut Ole, désolé de vous déranger, mais des idées ce qui ne va pas avec mon code ci-dessus? À la vôtre Dave. –

1

Dave,

Le code blitting fonctionne très bien, mais votre code à copier dans la mémoire tampon de trame est incorrect.

// Build bitmap 
int i, j, h; 
for (i = 0; i < WIDTH; i++) 
{ 
    for (j = 0; j < HEIGHT; j++) 
    { 
    h = frameBuffer01[i][j]; 
    bitmapData[/*step across a line*/i + /*step down a line*/j*WIDTH] = h; 
    } 
} 

Notez mes modifications de l'affectation aux éléments de bitmapData.

Ne connaissant pas la disposition de l'image, cela peut être incorrect, mais à partir de votre code, cela ressemble plus à l'intention.