2013-12-18 2 views
0

Я попытался использовать решение категории, описанное в этом сообщении (How to get the RGB values for a pixel on an image on the iphone). Кажется, он не работает в моем сценарии.Невозможно получить цвет пикселя в этом сценарии

В моем случае, я рисую круги в ответ на водопроводную жест:

//mainImageView is an IBOutlet of class UIImageView. So here we simply get a pointer to its image. 
UIImage *mainImage = self.mainImageView.image; 
//Start an image context. 
UIGraphicsBeginImageContextWithOptions(self.mainImageView.bounds.size, NO, 0.0); 
//Save the context in a handy variable for use later. 
CGContextRef context = UIGraphicsGetCurrentContext(); 

for (Ant *ant in self.ants) { //Ant is a subclass of NSObject. 
    //First draw the existing image into the context. 
    [mainImage drawInRect:CGRectMake(0, 0, self.mainImageView.bounds.size.width, self.mainImageView.bounds.size.height)]; 

    // Now draw a circle with position and size specified by the Ant object properties. 
    // Set the width of the line 
    CGFloat lineWidth = ant.size.width/20; 
    CGContextSetLineWidth(context, lineWidth); 
    CGContextSetFillColorWithColor(context, ant.color.CGColor); 
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
    CGContextBeginPath(context); 
    CGContextAddArc(context, 
        ant.location.x,       //center x coordinate 
        ant.location.y,       //center y coordinate 
        ant.size.width/2 - lineWidth/2,   //radius of circle 
        0.0, 2*M_PI, YES); 
    CGContextDrawPath(context, kCGPathFillStroke); 
} 
self.mainImageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

До сих пор так хорошо. Это рисует круг с цветами, как ожидалось, в self.mainImageView.image, а при повторных вызовах больше копий рисуется в новом месте. Ответ на какое-то событие (может быть таймер - может быть краном), местоположения объектов муравьев обновляются, идея состоит в том, чтобы посмотреть, что находится на экране в новом месте, и сделать какое-то действие на основе цвета в этом месте. Другой метод, moveAnt, включает в себя следующий код:

CGPoint newLocation = /*calculation of the location is not relevant to this discussion*/ 
UIColor *colorAtNewLocation = [self.mainImageView.image colorAtPosition:newLocation]; 

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

Так что же здесь происходит? Похоже, что метод colorAtPosition в категории должен ожидать формат CGImageRef, который отличается от того, что на самом деле создается выше. Это правильно? Это меня удивляет, потому что похоже, что этот метод был написан специально для того, чтобы иметь известный формат, поэтому я решил попробовать его.

+0

Я удалил вопрос, потому что думал, что проблема была в местах, но я уверен, что у меня это отсортировано. Теперь это работает некоторое время, но в большинстве случаев это не так. Может ли быть какое-то кэширование, когда, когда я ссылаюсь на 'self.mainImageView.image', он смотрит на устаревший' CGImageRef'? –

ответ

0

Проблема в том, что CGImageRef не знает о масштабе изображения. Проблема была устранена путем изменения метода в категории с включением аргумента масштаба. Затем размеры позиции умножаются на шкалу, чтобы получить правильное изображение для запроса цвета.

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