0

我创建了一个选择像素 RGB 值的页面。它允许用户移动他的手指并选择所选图像的像素颜色。还将因此获得的 RGB 设置为显示他的选择的小图像视图。

这是一段代码。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event allTouches] anyObject];

    // Get Touch location
    CGPoint touchLocation = [touch locationInView:touch.view];

    // Set touch location's center to ImageView
    if (CGRectContainsPoint(imageViewColorPicker.frame, touchLocation))
    {
        imageViewColorPicker.center = touchLocation;

        CGImageRef image = [imageViewSelectedImage.image CGImage];
        NSUInteger width = CGImageGetWidth(image);
        NSUInteger height = CGImageGetHeight(image);

        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

        unsigned char *rawData = malloc(height * width * 4);
        NSUInteger bytesPerPixel = 4;
        NSUInteger 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);

        int byteIndex = (bytesPerRow * (int)touchLocation.y) + (int)touchLocation.x * bytesPerPixel;
        red = rawData[byteIndex];
        green = rawData[byteIndex + 1];
        blue = rawData[byteIndex + 2];
        alpha = rawData[byteIndex + 3];


        imgPixelColor.backgroundColor=[UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:alpha];
    }
}

它正在解决我的问题。但问题是它有时会在手指移动期间Received Memory Warning在日志窗口中显示 3 次消息时崩溃。

难道我做错了什么?有没有其他方法可以让 RGB 解决此类问题?任何图书馆(如果有)?

快速帮助表示赞赏。

4

2 回答 2

1

您正在malloc为图形上下文 ( rawData) 设置像素缓冲区,但您从来没有这样做过free,因此每次触摸移动时,您基本上都会泄漏整个图像的副本(这可能很快就会占用大量内存)。

在你的 if 语句的末尾添加这个。

free(rawData);

顺便说一句,您可能需要考虑只创建一次位图上下文并重用它。每次触摸移动时重新绘制图像都是非常浪费的,如果它仍然保持不变的话。

于 2013-05-22T10:24:23.140 回答
0

@大卫:RinoTom 是对的。将您的询问作为答案发布是没有意义的。

无论如何,回到你的问题,我为这个问题创建了一个替代解决方案。我使用平移手势来移动视图并使用以下方法选择其中心点的 RGB:

-(UIColor *)colorOfTappedPoint:(CGPoint)point
{
    unsigned char pixel[4] = {0};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast);

    CGContextTranslateCTM(context, -point.x, -point.y);

    [self.view.layer renderInContext:context];

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0];

    red = pixel[0];
    green = pixel[1];
    blue = pixel[2];
    alpha = pixel[3];

    NSLog(@"%d %d %d %d",red,green,blue,alpha);
    return color;
}

希望这可以帮助。

于 2013-09-27T19:58:15.957 回答