我尝试使用这篇文章中描述的类别解决方案(如何获取 iphone 上图像上像素的 RGB 值)。它似乎不适用于我的场景。
在我的场景中,我绘制圆圈以响应点击手势:
//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];
红色、绿色和蓝色的值始终为零,并且 alpha 的值在每个会话中显然是随机的,但在会话期间保持不变。
那么这里发生了什么?似乎该colorAtPosition
类别中的方法必须期望一种与CGImageRef
上面实际创建的格式不同的格式。那正确吗?这让我感到惊讶,因为看起来该方法是专门为具有已知格式而编写的,这就是我决定尝试它的原因。