В настоящее время я пытаюсь получить альфа-значение пикселя в UIImageView. Я получил CGImage из изображения [UIImageView] и создал из него массив байтов RGBA. Альфа преумножается.
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);
Затем я вычисляю индекс массива для данного альфа-канала, используя координаты из UIImageView.
int byteIndex = (bytesPerRow * uiViewPoint.y) + uiViewPoint.x * bytesPerPixel;
unsigned char alpha = rawData[byteIndex + 3];
Однако я не получаю ожидаемые значения. Для полностью черной прозрачной области изображения я получаю ненулевые значения для альфа-канала. Нужно ли переводить координаты между UIKit и Core Graphics - i.e: инвертирована ли ось y? Или я неправильно понял предварительные значения альфа?
Update:
@Предложение Николая Рухе было ключом к этому. На самом деле мне не нужно было переводить между координатами UIKit и координатами Core Graphics. Однако, после установки режима наложения, мои альфа-значения были такими, какие я ожидал:
CGContextSetBlendMode(context, kCGBlendModeCopy);