如何围绕UIImage的边缘?

时间:2011-12-08 12:53:38

标签: iphone objective-c ios

我尝试加快滚动UITableView的速度。我这样做是通过自己绘制单元格而不是添加子视图。

我想要绘制的一件事是图像。图像应具有圆形边缘。当我使用子视图绘制单元格时,我将UIImageView的图层更改为具有圆角。

现在我直接绘制UIImage并且没有要修改的图层。如何用圆边绘制图像?

4 个答案:

答案 0 :(得分:0)

听起来你只想删除矩形图像中的角落:通过CGImage API创建一个新图像 - 您将对输入图像应用蒙版。

答案 1 :(得分:0)

我很确定我从stackoverflow获得了这段代码。

- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage {
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);

CGImageRef sourceImage = [image CGImage];
CGImageRef imageWithAlpha = sourceImage;
//add alpha channel for images that don't have one (ie GIF, JPEG, etc...)
//this however has a computational cost
// needed to comment out this check. Some images were reporting that they
// had an alpha channel when they didn't! So we always create the channel.
// It isn't expected that the wheelin application will be doing this a lot so 
// the computational cost isn't onerous.
//if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) { 
imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage);
//}

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);
CGImageRelease(mask);

//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel
if (sourceImage != imageWithAlpha) {
    CGImageRelease(imageWithAlpha);
}

UIImage* retImage = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);

return retImage;

}

我称之为:

    customImage = [customImage maskImage:customImage withMask:[UIImage imageNamed:@"CircularMask.png"]];
[customImageView setImage:customImage]; 

希望有所帮助!

答案 2 :(得分:0)

您是否对图像使用缓存?

如果是这样的话,我建议您在缓存之前将其应用于UIImage,这样一旦用圆角绘制它就可以重复使用该图像。

这是UIImage上的一个类别,您可以使用它来获得舍入的UIImage。

我可能在某个地方找到了这个代码,所以我提前向原作者道歉,因为没有给他/她一个信用。

#import <Foundation/Foundation.h>

@interface UIImage (DPRounded)
- (UIImage *)imageWithCornerRadius:(CGFloat)radius;
@end


@implementation UIImage (DPRounded)

static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight)
{
    float fw, fh;
    if (ovalWidth == 0 || ovalHeight == 0) {
        CGContextAddRect(context, rect);
        return;
    }
    CGContextSaveGState(context);
    CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect));
    CGContextScaleCTM (context, ovalWidth, ovalHeight);
    fw = CGRectGetWidth (rect) / ovalWidth;
    fh = CGRectGetHeight (rect) / ovalHeight;
    CGContextMoveToPoint(context, fw, fh/2);
    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);
    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);
    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);
    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1);
    CGContextClosePath(context);
    CGContextRestoreGState(context);
}

- (UIImage *)imageWithCornerRadius:(CGFloat)radius
{
    UIImage * newImage = nil;

    if(self != nil)
    {
        int w = self.size.width;
        int h = self.size.height;

        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);

        CGContextBeginPath(context);
        CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
        addRoundedRectToPath(context, rect, radius, radius);
        CGContextClosePath(context);
        CGContextClip(context);

        CGContextDrawImage(context, CGRectMake(0, 0, w, h), self.CGImage);

        CGImageRef imageMasked = CGBitmapContextCreateImage(context);
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);

        newImage = [[UIImage imageWithCGImage:imageMasked] retain];
        CGImageRelease(imageMasked);
    }

    return [newImage autorelease];
}

@end

答案 3 :(得分:-1)

(在您开始之前,请检查您是否正确地将表视图单元格出列。这将对提高性能有很大帮助。)

使用圆角自己绘制图像,并让单元格的背景透明,比如说。

如果你的细胞高度可变,

  1. 使用resizableImageWithCapInsets:(iOS5.0及更高版本)或已弃用的stretchableImageWithLeftCapWidth:topCapHeight:用于早期的iOS,通过重复图像的中心块来返回将展开的图像。当进行自动调整时,这也将保护角落的曲率。或者,

  2. 将您的图像剪切成碎片,并为每个部分分别设置UIImageView个实例,并为每个部分设置适当的自动调整。就性能而言,这是最佳选择,但最终可能会有多达九个出口。