2013-04-12 124 views
0

我有正确大小的图像的UITableViewCell。 这就是电池看起来应该像: enter image description here我如何裁剪图像以获得弯曲的不规则边缘?

和我有backgound: enter image description here

而且图像占位符: enter image description here

,我想知道是否有办法裁剪图像与iOS库?

+0

将图像占位符内的白色区域变为透明,然后在该图像下找到图像视图。不,没有这样的系统库。 PS:艺术品看起来不错! –

+0

你应该问这样的问题:'这是我的问题,这是我的尝试解决方案,我的解决方案有什么问题'***不*** ***'这是我的问题,为我写的解决方案'。 [你有什么尝试](http://whathaveyoutried.com) –

+1

@DavidH,不是真的,有一个核心图形功能,将做到这一点。仍然想看看MTA尝试了什么。请注意,这不是裁剪操作 - 它是裁剪/遮罩操作。 – Wain

回答

0

您可以使用CoreGraphics来添加带有路径的遮罩或剪辑。蒙版是图像与alpha通道,它决定了图像显示的部分。下面的示例如何与图像的掩膜:

- (UIImage *)croppedImage:(UIImage *)sourceImage 
{ 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextClipToMask(context, CGRectMake(0, 0, width, height), [UIImage imageNamed:@"mask"].CGImage); 

    [sourceImage drawInRect:CGRectMake(0, 0, width, height)]; 

    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return resultImage; 
} 

然后,你可以写cell.picture = [self croppedImage:sourceImage];

0

是的,这可能:

UIImage *imageToCrop = ...; 
UIGraphicsBeginImageContext(); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[imageToCrop drawAtPoint:CGPointZero]; 
CGContextAddEllipseInRect(context, CGRectMake(0 ,0, imageToCrop.size.width, imageToCrop.size.height); 
CGContextClip(context); 
UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
0

您可以使用图像掩码技术来裁剪这张图片 请看看在这个链接 https://developer.apple.com/library/mac/documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-CJBHIJEB

我写了一些代码可以帮助你出

@interface ImageRenderer : NSObject { 
UIImage *image_; 
} 
@property (nonatomic, retain) UIImage * image; 
- (void)cropImageinRect:(CGRect)rect; 
- (void)maskImageWithMask:(UIImage *)maskImage; 
- (void)imageWithAlpha; 
@end 

@implementation ImageRenderer 

@synthesize image = image_; 

- (void)cropImageinRect:(CGRect)rect { 
CGImageRef imageRef = CGImageCreateWithImageInRect(image_.CGImage, rect); 
image_ = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
} 

- (void)maskImageWithMask:(UIImage *)maskImage { 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGImageRef maskImageRef = [maskImage CGImage]; 
// create a bitmap graphics context the size of the image 
CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 
if (mainViewContentContext == NULL){ 
    return; 
    } 

CGFloat ratio = 0; 

ratio = maskImage.size.width/ image_.size.width; 

if(ratio * image_.size.height < maskImage.size.height) { 
    ratio = maskImage.size.height/ image_.size.height; 
} 

CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}}; 
CGRect rect2 = {{-((image_.size.width*ratio)-maskImage.size.width)/2 , -((image_.size.height*ratio)-maskImage.size.height)/2}, {image_.size.width*ratio, image_.size.height*ratio}}; 

CGContextClipToMask(mainViewContentContext, rect1, maskImageRef); 
CGContextDrawImage(mainViewContentContext, rect2, image_.CGImage); 
// Create CGImageRef of the main view bitmap content, and then 
// release that bitmap context 
CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext); 
CGContextRelease(mainViewContentContext); 

image_ = [UIImage imageWithCGImage:newImage]; 

CGImageRelease(newImage); 
} 

- (void)imageWithAlpha { 
CGImageRef imageRef = image_.CGImage; 
CGFloat width = CGImageGetWidth(imageRef); 
CGFloat height = CGImageGetHeight(imageRef); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst); 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 

CGImageRef resultImageRef = CGBitmapContextCreateImage(context); 
image_ = [UIImage imageWithCGImage:resultImageRef scale:image_.scale orientation:image_.imageOrientation]; 

CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 
CGImageRelease(resultImageRef); 
} 

@end 

在这段代码中,你可以裁剪出来的图像的一个更大的,然后你可以使用口罩图像完成您的工作。