Question

Je suis en train d'obtenir des composants ARVB de CGBitmapContext avec les codes suivants:


-(id) initWithImage: (UIImage*) image   //create BitmapContext with UIImage and use 'pixelData' as the pointer
{

        CGContextRef    context = NULL;
        CGColorSpaceRef colorSpace;
        int             bitmapByteCount;
        int             bitmapBytesPerRow;

        bitmapBytesPerRow   = (image.size.width * 4);                       
        bitmapByteCount     = (bitmapBytesPerRow * image.size.height);

        colorSpace = CGColorSpaceCreateDeviceRGB();                         
        pixelData = malloc( bitmapByteCount );      //unsigned char* pixelData is defined in head file
        context = CGBitmapContextCreate (pixelData,                         
                        image.size.width,
                        image.size.height,
                        8,    // bits per component
                        bitmapBytesPerRow,
                        colorSpace,
                        kCGImageAlphaPremultipliedFirst
                        );
        CGColorSpaceRelease( colorSpace );                                  

        CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
        pixelData = CGBitmapContextGetData(context);
        return self;
}


-(float) alphaAtX:(int)x y:(int)y   //get alpha component using the pointer 'pixelData' 
{
    return pixelData[(y *width + x) *4 + 3];    //+0 for red, +1 for green, +2 for blue, +3 for alpha
}

-(void)viewDidLoad { [super viewDidLoad]; UIImage *img = [UIImage imageNamed:@"MacDrive.png"]; //load image

[self initWithImage:img];   //create BitmapContext with UIImage
float alpha = [self alphaAtX:20 y:20];  //store alpha component

}

Quand toujours je tente de 240. stocker rouge / vert / bleu, ils Démoulez et alpha est toujours 255.

Je pense donc que peut-être quelque chose ne va pas avec le pointeur. Il ne pouvait pas retourner les données ARVB correcte que je veux. Toutes les idées sur ce qui ne va pas avec le code?

Était-ce utile?

La solution

Tout d'abord, vous êtes une fuite mémoire, la mémoire pixelData ne se libère.

Pour votre utilisation, il est préférable de laisser les appels CGContext gérer la mémoire. Il suffit de passer i.s.o. NULL pixelData, et aussi longtemps que vous gardez la référence compte sur votre contexte, le CGBitmapContextGetData(context) restera valide.

Vous utilisez alpha comme si elle était la dernière entrée (RGBA, non ARVB), l'utiliser comme tel dans la création de votre contexte, ou adapter le code alphaAtX. Je ne sais pas si vous voulez prémultipliée, si elle est juste pour vérifier les valeurs alpha, vous n'avez pas.

Dans l'ensemble quelque chose comme:

[...]
CGContextRelease(context);
context = CGBitmapContextCreate (NULL,                                                     
                                    image.size.width,
                                    image.size.height,
                                    8,    // bits per component
                                    bitmapBytesPerRow,
                                    colorSpace,
                                    kCGImageAlphaLast
                                    );
CGColorSpaceRelease( colorSpace );                                                                      

CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
pixelData = CGBitmapContextGetData(context);
[...]

avec le contexte étant une variable membre, initialisé à NULL, sera déjà un pas dans la bonne direction.

Autres conseils

D'abord, je voudrais vérifier si le contexte est revenu de votre appel CGBitmapContextCreate est valide (qui est, assurez-vous context != NULL). Je vérifie aussi pour vous assurer que votre image initialement chargée est valide (donc, assurez-vous img != nil).

Si votre contexte est nul, il peut être parce que votre taille de l'image est déraisonnable, ou bien votre format de données de pixel est indisponible. Essayez d'utiliser à la place kCGImageAlphaPremultipliedLast?

Deuxièmement, vous n'avez pas besoin d'utiliser CGBitmapContextGetData - vous pouvez simplement utiliser le pointeur de pixelData vous avez passé à la première place. Vous devez également CGContextRelease votre contexte avant de quitter votre fonction initWithImage: pour éviter une fuite.

Je note également que vous utilisez kCGImageAlphaPremultipliedFirst. Cela signifie que le composant alpha est premier , ne durent pas, à votre image, si vous voulez un décalage de 0 pour le composant alpha dans votre fonction alphaAtX:y:.

Est-ce que tout cela aide?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top