我尝试过使用这篇文章(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];
红色,绿色和蓝色的值始终为零,并且每个会话的alpha值显然是随机的,但在会话期间保持不变。
那么这里发生了什么?似乎该类别中的colorAtPosition
方法必须期望CGImageRef
的格式与上面实际创建的格式不同。是对的吗?这让我感到惊讶,因为看起来这个方法是专门为了有一个已知的格式而编写的,这就是为什么我决定尝试它。
答案 0 :(得分:0)
问题是CGImageRef不知道图像的比例。通过更改类别中的方法以包含scale参数来解决此问题。然后将位置尺寸乘以比例以获得正确的图像以查询颜色。