Je suis en train d'essayer d'obtenir l'alpha de la valeur d'un pixel dans une UIImageView. J'ai obtenu le CGImage de [UIImageView image] et créé un RGBA tableau d'octets à partir de ce. Alpha est prémultipliée.
CGImageRef image = uiImage.CGImage;
NSUInteger width = CGImageGetWidth(image);
NSUInteger height = CGImageGetHeight(image);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
rawData = malloc(height * width * 4);
bytesPerPixel = 4;
bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(
rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
CGContextRelease(context);
J'ai ensuite calculer l'index de tableau pour le canal alpha en utilisant les coordonnées de la UIImageView.
int byteIndex = (bytesPerRow * uiViewPoint.y) + uiViewPoint.x * bytesPerPixel;
unsigned char alpha = rawData[byteIndex + 3];
Cependant je n'ai pas les valeurs que j'attends. Pour un tout noir zone transparente de l'image, j'obtiens des valeurs non nulles pour le canal alpha. Ai-je besoin de traduire les coordonnées entre UIKit et Graphiques de Base - je.e: est l'axe y inversé? Ou ai-je mal compris prémultiplié valeurs alpha?
Mise à jour:
@Nicolas Ruhe la suggestion a été la clé de cette. Je n'ai pas besoin de traduire entre les UIKit coordonnées et Graphiques de Base des coordonnées. Cependant, après avoir défini le mode de fusion de mes valeurs alpha ont été ce que j'attendais:
CGContextSetBlendMode(context, kCGBlendModeCopy);