У меня возникла странная проблема. Я использую CGBitmapContextCreate, чтобы получить необработанные данные пикселей из изображения, а затем изменить цвет пикселей в указанном месте. Тем не менее, я обнаружил, что когда я получаю RGBA пикселя, у которого альфа равна 1, все идет хорошо, но если альфа меньше 1, RGB неверен, это более темный цвет. Может кто-нибудь сказать мне, почему, это сводит меня с ума ...
Вот мой код, и вы можете получить тестовое изображение здесь
#define Mask8(x) ( (x) & 0xFF )
#define R(x) ( Mask8(x) )
#define G(x) ( Mask8(x >> 8 ) )
#define B(x) ( Mask8(x >> 16) )
#define A(x) ( Mask8(x >> 24) )
#define RGBAMake(r, g, b, a) ( Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )
- (void)getPixelRGBA
{
UIImage *image = [UIImage imageNamed:@"testpicture.png"];
NSUInteger bytesPerRow = 4*image.size.width;
UInt32 *pixels = (UInt32 *)calloc(image.size.width*image.size.height, sizeof(UInt32));
CGContextRef context = CGBitmapContextCreate(pixels, image.size.width, image.size.height, 8, bytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
// pixel with alpha < 1, color gets dark
int offset1 = 75 * (int)image.size.width + 75;
UInt32 *pixelValue1 = pixels + offset1;
UInt32 pixelColor1 = *pixelValue1;
UInt32 r1 = R(pixelColor1);
UInt32 g1 = G(pixelColor1);
UInt32 b1 = B(pixelColor1);
CGFloat a1 = A(pixelColor1)/255.0f;
// pixel with alpha == 1, color is right
int offset2 = 75 * (int)image.size.width + 80;
UInt32 *pixelValue2 = pixels + offset2;
UInt32 pixelColor2 = *pixelValue2;
UInt32 r2 = R(pixelColor2);
UInt32 g2 = G(pixelColor2);
UInt32 b2 = B(pixelColor2);
CGFloat a2 = A(pixelColor2)/255.0f;
}
Большое спасибо, ребята!