iPhone RGBA值未正确保存

iPhone RGBA值未正确保存,iphone,drawing,quartz-graphics,pixel,Iphone,Drawing,Quartz Graphics,Pixel,我正在使用GraphicsContext进行二维绘图。对于某些操作,我需要编辑单个像素。然而,一些奇怪的事情正在发生,我的像素并没有得到应有的保留。我画红色矩形,半透明-红色设置为1(255),透明度设置为0.5(128)。当我稍后读取像素时,红色现在是128(其值的一半),alpha是128(这是正确的)。我想稍后查找所有值为255的红色像素,并对其进行更改,但这是不可能的,因为它们没有保留设置的值。这是我的密码: UIGraphicsBeginImageContextWithOptions(

我正在使用GraphicsContext进行二维绘图。对于某些操作,我需要编辑单个像素。然而,一些奇怪的事情正在发生,我的像素并没有得到应有的保留。我画红色矩形,半透明-红色设置为1(255),透明度设置为0.5(128)。当我稍后读取像素时,红色现在是128(其值的一半),alpha是128(这是正确的)。我想稍后查找所有值为255的红色像素,并对其进行更改,但这是不可能的,因为它们没有保留设置的值。这是我的密码:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthT, heightT), NO, 1);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
//CGContextSaveGState(contextRef);
CGContextSetRGBFillColor(contextRef, 1, 0, 0, 0.5);
CGContextSetRGBStrokeColor(contextRef, 1, 0, 0, 0.5);
CGContextFillRect(contextRef, CGRectMake(0, 0, 400, 400));

UIImage *imageMoonMask = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//NSData *data = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));

NSData *data = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(imageMoonMask.CGImage));

Byte *copyPixels = (Byte *)[data bytes];
pixels = (Byte *) malloc([data length] * sizeof (Byte));

for(int i = 0; i < [data length]; i += 4) {
    pixels[i] = copyPixels[i];
    pixels[i+1] = copyPixels[i+1];
    pixels[i+2] = copyPixels[i+2]; //red color
    pixels[i+3] = copyPixels[i+3]; //alpha
    NSLog(@"Originalni");
    NSLog(@"%u", pixels[i]);
    NSLog(@"%u", pixels[i+1]);
    NSLog(@"%u", pixels[i+2]);
    NSLog(@"%u", pixels[i+3]);
}
UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthT,heightT),NO,1);
CGContextRef contextRef=UIGraphicsGetCurrentContext();
//CGContextSaveGState(contextRef);
CGContextSetRGBFillColor(contextRef,1,0,0,0.5);
CGContextSetRGBStrokeColor(contextRef,1,0,0,0.5);
CGContextFillRect(contextRef,CGRectMake(0,040400));
UIImage*imageMoonMask=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
//NSData*数据=(NSData*)CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
NSData*数据=(NSData*)CGDataProviderCopyData(CGImageGetDataProvider(imageMoonMask.CGImage));
字节*复制像素=(字节*)[数据字节];
像素=(字节*)malloc([数据长度]*sizeof(字节));
对于(int i=0;i<[数据长度];i+=4){
像素[i]=复制像素[i];
像素[i+1]=复制像素[i+1];
像素[i+2]=复制像素[i+2];//红色
像素[i+3]=复制像素[i+3];//alpha
NSLog(@“Originalni”);
NSLog(@“%u”,像素[i]);
NSLog(@“%u”,像素[i+1]);
NSLog(@“%u”,像素[i+2]);
NSLog(@“%u”,像素[i+3]);
}
字节以预乘alpha格式存储,以实现更高效的alpha混合。通过核心图形创建自定义位图上下文,可以避免预乘alpha。 CGBitmapContextCreate并使用kCGImageAlphaLast而不是KCGimageAlphaPremultipledLast

但是,仅仅使用

CGFloat red = copyPixels[i+2] * 255.0f / copyPixels[i];
字节以预乘alpha格式存储,以允许更有效的alpha混合。通过核心图形创建自定义位图上下文,可以避免预乘alpha。 CGBitmapContextCreate并使用kCGImageAlphaLast而不是KCGimageAlphaPremultipledLast

但是,仅仅使用

CGFloat red = copyPixels[i+2] * 255.0f / copyPixels[i];

如果希望在使用预乘alpha格式位图时保留RGB像素值,则这些值都应小于或等于alpha值


由于RGB位图值是字节整数,由于舍入或量化,尝试将预乘值重新缩放回非预乘原始值将有损。

如果您希望在使用预乘alpha格式位图时保留RGB像素值,这些值都应小于或等于alpha值


由于您的RGB位图值是字节整数,因此,由于舍入或量化,尝试将预乘值重新缩放回非预乘原始值将是有损的。

在将alpha渲染到图像上时,它看起来是预乘的(尽管我不知道为什么)。您可以尝试使用
CGContextBeginTransparencyLayer
来绘制alpha混合内容,但我假设您的代码可以正常工作:(看起来在将alpha渲染到图像上时,您的alpha正在被预乘(尽管我不知道为什么)。您可以尝试使用
CGContextBeginTransparencyLayer
绘制alpha混合内容,但我认为您的代码可以正常工作:(所以如果我通过CGBitmapContextCreate创建图像,并设置该常数,像素应以非预乘格式存储?那么如果我通过CGBitmapContextCreate创建图像,并设置该常数,像素应以非预乘格式存储?