【问题标题】:glReadPixels() not updatingglReadPixels() 不更新
【发布时间】:2013-07-08 21:55:47
【问题描述】:

我正在使用代码渲染圆形渐变并通过触摸在渐变上创建十字准线(子视图)。我现在想读取触摸位置的像素并让它返回 RGB 值,但它总是给我相同的值..

编辑:添加了渲染渐变的代码

全新代码:

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];

    }

我的平移手势识别器:

    - (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);


}

一些 NSLog:

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

编辑:颜色也不正确。我在第一次移动时得到不同的 RGB 值,然后该值更改一次并保持不变。

是 glReadPixels 这么慢,还是我的帧缓冲区有问题?

【问题讨论】:

  • 我还是没搞清楚,很遗憾

标签: ios objective-c for-loop opengl-es


【解决方案1】:

您在每次检测到事件后重置手势识别器的翻译。这意味着colorPoint 中的坐标变化不大。

您应该使用sender.view.center 计算colorPoint,并将其转换为iv 的坐标系。

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];

现在colorPoint 是手势识别器视图的当前位置,以iv 的坐标系表示。

【讨论】:

  • 坐标现在可以正确更新,但颜色没有。
  • 另一件事:永远不要直接操纵你试图移动或旋转的视图;相反,它的超级视图。
【解决方案2】:

好的,不更新的问题我自己解决了。 我现在使用的是完全不同的阅读方法。

感谢 Nikolai 让我开始定心

- (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);







}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多