如何在用户触摸时擦除部分图像
我的主要目标是在图像上有一个灰色区域,然后当用户在该灰色区域上摩擦时,它会显示下面的图像。基本上像一个彩票刮板卡。我已经完成了大量搜索文档以及本网站,但无法找到解决方案。如何在用户触摸时擦除部分图像
以下只是基于用户触摸位置测试“擦除”图像的概念验证,但它不起作用。 :(
我有一个检测触摸一个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];
}
的问题是,触摸被发送到这个方法不错,但什么也没有发生在原。
我做剪辑路径不正确?还是?
不能确定...所以你可能有任何帮助,将不胜感激。
由于提前, 乔尔
很久以前,我一直在尝试做同样的事情,只使用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
通常你想画成的drawRect内当前图形上下文:方法,不是任何旧方法。此外,剪辑区域仅影响绘制到当前图形上下文的内容。但是不要去探讨为什么这种方法不起作用,我会建议采取不同的方式。
我会做的是有两个意见。一个带有图像,另一个带有透明的灰色。这允许图形硬件缓存图像,而不是每次修改灰色填充时尝试重新绘制图像。
灰色将是一个带有CGBitmapContext的UIView子类,您可以通过该子类来使用户触摸的像素清晰。
可能有几种方法可以做到这一点。我只是建议一种方式。
感谢您指出我在正确的方向。我之前正在研究这个问题,但是找不到正确的方法来创建一个ARGB位图(它看起来总是一个RGB),并且2)一旦我有二维像素数据数组,就可以操纵像素的alpha值。我会继续挖掘并发布我发现的内容。谢谢。 – Joel 2010-06-05 14:52:24
如果您发布了解决方案Joel,这将会非常方便。 (或者至少是相关的drawRect方法。) – livingtech 2010-12-09 23:50:13