在这种情况下无法获得像素的颜色

时间:2013-12-18 21:10:25

标签: objective-c uiimage cgimageref

我尝试过使用这篇文章(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的格式与上面实际创建的格式不同。是对的吗?这让我感到惊讶,因为看起来这个方法是专门为了有一个已知的格式而编写的,这就是为什么我决定尝试它。

1 个答案:

答案 0 :(得分:0)

问题是CGImageRef不知道图像的比例。通过更改类别中的方法以包含scale参数来解决此问题。然后将位置尺寸乘以比例以获得正确的图像以查询颜色。