2010-06-04 96 views
4

我的主要目标是在图像上有一个灰色区域,然后当用户在该灰色区域上摩擦时,它会显示下面的图像。基本上像一个彩票刮板卡。我已经完成了大量搜索文档以及本网站,但无法找到解决方案。如何在用户触摸时擦除部分图像

以下只是基于用户触摸位置测试“擦除”图像的概念验证,但它不起作用。 :(

我有一个检测触摸一个UIView,然后将移动的COORDS到的UIViewController是剪辑做在一个UIImageView图像以下:

- (void) moveDetectedFrom:(CGPoint) from to:(CGPoint) to 
{ 
    UIImage* image = bkgdImageView.image; 
    CGSize s = image.size; 
    UIGraphicsBeginImageContext(s); 
    CGContextRef g = UIGraphicsGetCurrentContext(); 

    CGContextMoveToPoint(g, from.x, from.y); 
    CGContextAddLineToPoint(g, to.x, to.y); 
    CGContextClosePath(g); 
    CGContextAddRect(g, CGRectMake(0, 0, s.width, s.height)); 
    CGContextEOClip(g); 
    [image drawAtPoint:CGPointZero]; 
    bkgdImageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    [bkgdImageView setNeedsDisplay]; 
} 

的问题是,触摸被发送到这个方法不错,但什么也没有发生在原。

我做剪辑路径不正确?还是?

不能确定...所以你可能有任何帮助,将不胜感激。

由于提前, 乔尔

回答

1

很久以前,我一直在尝试做同样的事情,只使用Core Graphics,它可以完成,但相信我,效果并不像用户期望的那样流畅和柔和。所以,我知道如何与OpenCV合作,(开放计算机视觉库),并且由于它是用C编写的,我知道我可以在iPhone上使用它。 做你想用OpenCV做什么是非常容易的。 首先,你需要一些函数来将UIImage转换为IplImage,这是OpenCV用来表示各种图像的类型,反之亦然。

+ (IplImage *)CreateIplImageFromUIImage:(UIImage *)image { 
CGImageRef imageRef = image.CGImage; 
//This is the function you use to convert a UIImage -> IplImage 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4); 
CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height, 
               iplimage->depth, iplimage->widthStep, 
               colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault); 
CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width, image.size.height), imageRef); 


CGContextRelease(contextRef); 

CGColorSpaceRelease(colorSpace); 

return iplimage;} 



+ (UIImage *)UIImageFromIplImage:(IplImage *)image { 

//Convert a IplImage -> UIImage 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
NSData * data = [[NSData alloc] initWithBytes:image->imageData length:image->imageSize]; 
//NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize]; 
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data); 
CGImageRef imageRef = CGImageCreate(image->width, image->height, 
            image->depth, image->depth * image->nChannels, image->widthStep, 
            colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault, 
            provider, NULL, false, kCGRenderingIntentDefault); 
UIImage *ret = [[UIImage alloc] initWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
CGDataProviderRelease(provider); 
CGColorSpaceRelease(colorSpace); 
[data release]; 
return ret;} 

现在你有两个你需要,你可以做任何你想要与你的IplImage的基本功能: 这是你想要的东西:

+(UIImage *)erasePointinUIImage:(IplImage *)image :(CGPoint)point :(int)r{ 
//r is the radious of the erasing 
    int a = point.x; 
int b = point.y; 
int position; 
int minX,minY,maxX,maxY; 
minX = (a-r>0)?a-r:0; 
minY = (b-r>0)?b-r:0; 
maxX = ((a+r) < (image->width))? a+r : (image->width); 
maxY = ((b+r) < (image->height))? b+r : (image->height); 

for (int i = minX; i < maxX ; i++) 
{ 
    for(int j=minY; j<maxY;j++) 
    { 
     position = ((j-b)*(j-b))+((i-a)*(i-a)); 
     if (position <= r*r) 
     { 
      uchar* ptr =(uchar*)(image->imageData) + (j*image->widthStep + i*image->nChannels); 
      ptr[1] = ptr[2] = ptr[3] = ptr[4] = 0; 
     } 
    } 
} 
UIImage * res = [self UIImageFromIplImage:image]; 
return res;} 

很抱歉的格式。

如果你想知道如何移植的OpenCV的iPhone Yoshimasa Niwa's

如果你想看看目前与OpenCV的工作在AppStore上的应用程序去获得:Flags&Faces

1

通常你想画成的drawRect内当前图形上下文:方法,不是任何旧方法。此外,剪辑区域仅影响绘制到当前图形上下文的内容。但是不要去探讨为什么这种方法不起作用,我会建议采取不同的方式。

我会做的是有两个意见。一个带有图像,另一个带有透明的灰色。这允许图形硬件缓存图像,而不是每次修改灰色填充时尝试重新绘制图像。

灰色将是一个带有CGBitmapContext的UIView子类,您可以通过该子类来使用户触摸的像素清晰。

可能有几种方法可以做到这一点。我只是建议一种方式。

+0

感谢您指出我在正确的方向。我之前正在研究这个问题,但是找不到正确的方法来创建一个ARGB位图(它看起来总是一个RGB),并且2)一旦我有二维像素数据数组,就可以操纵像素的alpha值。我会继续挖掘并发布我发现的内容。谢谢。 – Joel 2010-06-05 14:52:24

+0

如果您发布了解决方案Joel,这将会非常方便。 (或者至少是相关的drawRect方法。) – livingtech 2010-12-09 23:50:13