2013-02-21 3 views
1

Étant donné un CGRect (rect) et un UIImage (image), comment obtenez-vous les valeurs alpha (uniquement) des pixels de l'image dans le rectangle?Obtenir le canal alpha à partir du rectangle UIImage

Le code suivant renvoie toujours 0 alpha, peu importe l'image ou le rectangle.

CGContextRef context = CGBitmapContextCreate(NULL, 
              rect.size.width, 
              rect.size.height, 
              8, 
              rect.size.width, 
              NULL, 
              kCGImageAlphaOnly); 

UIGraphicsPushContext(context); 
[image drawInRect:rect]; 
char *pixels = CGBitmapContextGetData(context); 
NSUInteger pixelCount = rect.size.width * rect.size.height; 
for (int i = 0; i < pixelCount; i++) 
{ 
    char pixel = pixels[i]; 
    CGFloat alpha = pixel/255.0; 
    NSLog(@"%f", alpha); 
} 
UIGraphicsPopContext(); 
CGContextRelease(context); 
+0

curieux de savoir si vous avez essayé ma recommandation ci-dessous. Vous vous demandez si cela a résolu le problème? – Spectravideo328

+0

@ Spectravideo328 Non. – hpique

+0

Je me demande si l'espace de couleurs est important lorsque vous capturez une image à partir du contexte. Avez-vous essayé de créer un CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); et en l'affectant au 6ème argument (en remplaçant NULL). – Spectravideo328

Répondre

0

Par le passé, j'ai eu des problèmes pour que CGBitmapContext fonctionne correctement. Je ne serais pas surpris s'il y avait un problème avec kCGImageAlphaOnly. Vous pourriez faire quelques vérifications de santé mentale avec certains des formats de pixels les plus courants comme kCGImageAlphaPremultipliedFirst.

Vous pouvez également essayer de dessiner l'image en utilisant CGImageDrawImage:

CGContextRef context = CGBitmapContextCreate(NULL, 
             rect.size.width, 
             rect.size.height, 
             8, 
             rect.size.width, 
             NULL, 
             kCGImageAlphaOnly); 

CGContextDrawImage(context, rect, image.CGImage); 

//etc... 

CGContextRelease(context); 
+0

J'ai essayé avec CGContextDrawImage et kCGImageAlphaOnly fonctionne comme annoncé. Je dirais que j'utilise drawInRect: incorrectement. Une idée pourquoi? – hpique

+0

Si rect.origin! = 0, 0, vous dessinerez au mauvais endroit ... – nielsbot

+0

Aucune idée. Peut-être UIGraphic a un problème non documenté avec les formats de pixels kCGImageAlphaOnly, ou peut-être appeler UIGraphicsPopContext() avant d'essayer de récolter les données fonctionnerait (juste des conjectures sauvages). Cependant, puisque vous faites tout le reste au niveau de la CG, il semble inutile de passer au niveau UIGraphics pour faire votre dessin. –

0

pixelData[index + 3] sera une valeur pour Alpha. pixelData[0-2] sont respectivement RVB

CFDataRef theData;

theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage)); 

    CFMutableDataRef mutableData = CFDataCreateMutableCopy(0, 0, theData); 

    UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(mutableData); 

    int dataLength = CFDataGetLength(mutableData); 

    for (int index = 0; index < dataLength; index += 4) { 
     //code here for just alpha 
     pixelData[index + 3] 
    } 
+0

Est-ce que 'kCGImageAlphaOnly' ne renvoie pas un octet, comme indiqué ici: http://developer.apple.com/library/mac/#qa/qa1037/_index.html? – hpique

+0

Vous pouvez toujours manipuler les données ou réinitialiser ce pixel dans l'instruction for. Ex. si je veux changer l'alpha de 1 à 255, multipliez-le par 255. – Eric

+0

Je ne comprends pas votre solution. Vous n'utilisez pas le rectangle d'entrée et vous chargez toute l'image en mémoire. – hpique

0

Dans mon expérience avec des valeurs RGBA est qu'ils doivent tous être unsigned char. Je suppose que cela pourrait avoir causé votre problème car un char signé s'arrêterait à 127 et n'atteindrait jamais la valeur 255 complète si cette image avait une opacité de 1 - et peut-être pire ne serait pas correctement alignée (lire).

+0

La modification en caractère non signé n'a pas modifié le résultat. Cela dit, il devrait être non signé char de toute façon, donc j'ai édité la question originale. – hpique

Questions connexes