简体   繁体   中英

glReadPixels() not updating

i'm using code to render a circular gradient and create a crosshair (subview) on the gradient via touch. I now want to read the pixels at touch position and have it return the RGB value, but it always gives me the same value..

EDIT : added the code that renders the gradient

COMPLETELY NEW CODE :

viewDidLoad

 - (void)viewDidLoad
    {
        [super viewDidLoad];
        CGSize size = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(size.width, size.height), YES, 0.0);
        [[UIColor whiteColor] setFill];
        UIRectFill(CGRectMake(0, 0, size.width, size.height));

        int sectors = 180;
        float radius = MIN((size.width - 100), (size.height - 100))/2;
        float angle = 2 * M_PI/sectors;
        UIBezierPath *bezierPath;
        for ( int i = 0; i < sectors; i++)
        {
            CGPoint center = CGPointMake((size.width/2), (size.height/2));
            bezierPath = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:i * angle endAngle:(i + 1) * angle clockwise:YES];
            [bezierPath addLineToPoint:center];
            [bezierPath closePath];
            UIColor *color = [UIColor colorWithHue:((float)i)/sectors saturation:1. brightness:1. alpha:1];
            [color setFill];
            [color setStroke];
            [bezierPath fill];
            [bezierPath stroke];
        }
        img = UIGraphicsGetImageFromCurrentImageContext();
        iv = [[UIImageView alloc] initWithImage:img];
        [self.view addSubview:iv];
        [self.view addSubview:ch];

    }

My pan gesture recognizer :

    - (IBAction)handlePan:(UIPanGestureRecognizer *)sender {


        CGPoint translation = [sender translationInView:self.view];
        [sender setTranslation:CGPointZero inView:self.view];

        CGPoint center = sender.view.center;
        center.x += translation.x;
        center.y += translation.y;

        sender.view.center = center;
        CGPoint colorPoint = [sender.view.superview convertPoint:center toView:iv];

       [sender setTranslation:CGPointMake(0, 0) inView:self.view];


        CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(img.CGImage));
        const UInt8* data = CFDataGetBytePtr(pixelData);

        int pixelInfo = (img.size.width  * colorPoint.y ) +colorPoint.x ;

        float red = data[pixelInfo];         
        float green = data[(pixelInfo + 1)]; 
        float blue = data[pixelInfo + 2];    
        float alpha = data[pixelInfo + 3];             
        UIColor *pixelcolor = [UIColor colorWithRed:red/255 green:green/255 blue:blue/255 alpha:alpha]; // The pixel color info
        CFRelease(pixelData);
        NSLog(@"Color Value : %f, %f, %f, %f",red,green,blue,alpha);


}

Some of the NSLogs :

2013-07-05 10:04:20.913 ColorPicker[614:11603] pixel color: 156, 212, 255
2013-07-05 10:04:20.929 ColorPicker[614:11603] pixel color: 156, 212, 255
2013-07-05 10:04:20.947 ColorPicker[614:11603] pixel color: 156, 212, 255
2013-07-05 10:04:21.014 ColorPicker[614:11603] pixel color: 156, 212, 255
2013-07-05 10:04:21.047 ColorPicker[614:11603] pixel color: 156, 212, 255
2013-07-05 10:04:21.447 ColorPicker[614:11603] pixel color: 156, 212, 255

EDIT : The Colors are also incorrect. I get a different RGB value at the very first move, then the value changes once and stays the same.

Is glReadPixels just this slow, or is something wrong with my frame buffer?

You are resetting the gesture recognizer's translation after every detected event. This means that the coordinates in colorPoint do not vary much.

You should calculate colorPoint by using sender.view.center and converting this into iv 's coordinate system.

CGPoint translation = [sender translationInView:self.view];
[sender setTranslation:CGPointZero inView:self.view];

CGPoint center = sender.view.center;
center.x += translation.x;
center.y += translation.y;

sender.view.center = center;
CGPoint colorPoint = [sender.view.superview convertPoint:center toView:iv];

Now colorPoint is the current position of the gesture recognizer's view, expressed in iv 's coordinate system.

Alright, the issue of it not updating was solved by myself. I am using a whole different reading method now.

Thanks to Nikolai for getting me started on the centering

- (IBAction)handlePan:(UIPanGestureRecognizer *)sender {


    CGPoint translation = [sender translationInView:iv];
    [sender setTranslation:CGPointZero inView:self.view];

    CGPoint center = sender.view.center;
    center.x += translation.x;
    center.y += translation.y;

    sender.view.center = center;
    CGPoint colorPoint = [sender.view.superview convertPoint:center toView:iv];

   [sender setTranslation:CGPointMake(0, 0) inView:self.view];





    CGImageRef image = img.CGImage;
    NSUInteger width = CGImageGetWidth(image);
    NSUInteger height = CGImageGetHeight(image);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    char *rawData = malloc(height * width * 4);
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(
                                                 rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
                                                 );
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGColorSpaceRelease(colorSpace);

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
    CGContextRelease(context);
    int byteIndex = (bytesPerRow * colorPoint.y) + colorPoint.x * bytesPerPixel;
    unsigned char red = rawData[byteIndex];
    unsigned char green = rawData[byteIndex+1];
    unsigned char blue = rawData[byteIndex+2];


    UIColor *hauptfarbe = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
    ch.backgroundColor = hauptfarbe;





    NSLog(@"Color value - R : %i G : %i : B %i",red, green, blue);







}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM