2013-05-22 3 views
0

Я создал страницу, которая выбирает значения RGB для пикселя. Он позволяет пользователю перемещать палец и выбирать цвет пикселя выбранного изображения. Также установив таким образом RGB, на небольшое изображение, показывающее его выбор.Получение RGB пикселя в touchhesMoved delegate

Вот фрагмент кода.

- (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 решить эту проблему? Любая библиотека, если она доступна?

Краткая справка приветствуется.

ответ

1

Вы malloc ИНГ буфер пикселей для графического контекста (rawData), но вы никогда не free это, так что вы в основном протечки копию всего изображения, каждый раз, когда сенсорный движется (это может быть много памяти довольно быстро).

Добавьте это в конец вашего оператора if.

free(rawData); 

Кстати, вы можете захотеть создать контекст растрового изображения только один раз и повторно использовать его. Весьма расточительно перерисовывать изображение каждый раз, когда движется касание, если оно остается неизменным в любом случае.

+0

Спасибо man..freeing (rawData) помогли избежать краха. Однако, пожалуйста, уточните, как использовать контекст. Я делаю это так, который я предполагаю, что неправильный путь: (! Контекст) если { контекст = CGBitmapContextCreate (RAWDATA, ширина, высота, bitsPerComponent, bytesPerRow, COLORSPACE, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);} CGColorSpaceRelease (COLORSPACE) ; CGContextDrawImage (контекст, CGRectMake (0, 0, ширина, высота), изображение); CGContextRelease (контекст); Кроме того, поскольку я рисую изображение снова и снова, движущееся изображение для выбора цвета работает очень медленно. Просьба предложить, – Sourabh

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

Надеюсь, это поможет.

Смежные вопросы