2011-02-03 46 views
5

Tôi đang sử dụng mã sau để thêm các góc tròn vào UIImage của tôi, nhưng vấn đề là các góc tròn đang hiển thị vùng "trắng" thay vì trong suốt hoặc "rõ ràng". am i làm gì sai ở đây:UIImage với các góc tròn trong suốt

- (UIImage *)makeRoundCornerImageWithCornerWidth:(int)cornerWidth cornerHeight:(int)cornerHeight { 
    UIImage * newImage = nil; 

    if (self != nil) { 
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
     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); 
     [self addRoundedRectToPath:context rect:rect width:cornerWidth height:cornerHeight]; 

     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); 

     [pool release]; 
    } 

    return [newImage autorelease]; 
} 


- (void)addRoundedRectToPath:(CGContextRef)context rect:(CGRect)rect width:(float)ovalWidth height:(float)ovalHeight { 
    float fw, fh; 

    // If the width or height of the corner oval is zero, then it reduces to a right angle, 
    // so instead of a rounded rectangle we have an ordinary one. 
    if (ovalWidth == 0 || ovalHeight == 0) { 
     CGContextAddRect(context, rect); 
     return; 
    } 

    // Save the context's state so that the translate and scale can be undone with a call 
    // to CGContextRestoreGState. 
    CGContextSaveGState(context); 

    // Translate the origin of the contex to the lower left corner of the rectangle. 
    CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect)); 

    //Normalize the scale of the context so that the width and height of the arcs are 1.0 
    CGContextScaleCTM (context, ovalWidth, ovalHeight); 

    // Calculate the width and height of the rectangle in the new coordinate system. 
    fw = CGRectGetWidth (rect)/ovalWidth; 
    fh = CGRectGetHeight (rect)/ovalHeight; 

    // CGContextAddArcToPoint adds an arc of a circle to the context's path (creating the rounded 
    // corners). It also adds a line from the path's last point to the begining of the arc, making 
    // the sides of the rectangle. 
    CGContextMoveToPoint(context, fw, fh/2);    // Start at lower right corner 
    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); // Top right corner 
    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);  // Top left corner 
    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);  // Lower left corner 
    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // Back to lower right 

    // Close the path 
    CGContextClosePath(context); 

    // Restore the context's state. This removes the translation and scaling 
    // but leaves the path, since the path is not part of the graphics state. 
    CGContextRestoreGState(context); 
} 
+0

tại sao bạn không thêm 'cornerRadius' đến lớp xem của bạn và thiết lập masksToBounds YES ... đó sẽ hiển thị góc tròn .. – lukya

+0

đây là một bài đăng tuyệt vời để đọc, với mã - http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/ – petert

+0

@lukya, vâng tôi có thể và tôi có, nhưng tôi chỉ muốn kiểm tra vấn đề với đoạn mã này. – Mustafa

Trả lời

11

Dưới đây là một công thức đơn giản sử dụng UIKit gọi:

- (UIImage*) roundCorneredImage: (UIImage*) orig radius:(CGFloat) r { 
    UIGraphicsBeginImageContextWithOptions(orig.size, NO, 0); 
    [[UIBezierPath bezierPathWithRoundedRect:(CGRect){CGPointZero, orig.size} 
           cornerRadius:r] addClip]; 
    [orig drawInRect:(CGRect){CGPointZero, orig.size}]; 
    UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return result; 
} 

Thông báo các tham số NO - điều này làm bối cảnh hình ảnh minh bạch, vì vậy khu vực cắt bớt phòng là minh bạch.

1

Ngay sau khi tạo bối cảnh bitmap rõ ràng nó với: Cảm nhận

CGContextClearRect (context, CGRectMake(0, 0, w, h)); 
1

lukya của bên dưới câu hỏi của bạn là những gì bạn có thể muốn làm.

Hãy chắc chắn rằng bạn nhập QuartzCore:

#import <QuartzCore/QuartzCore.h> 

Sau đó, nếu bạn có một UIImageView của hình ảnh mà bạn muốn có góc tròn, chỉ cần gọi số (giả sử IMAGExem là một tài sản và cornerRadius là góc bán kính mong muốn):

self.imageView.layer.cornerRadius = cornerRadius; 
self.imageView.clipsToBounds = YES; 

Vì bạn đã có self.CGImage, bạn có thể làm điều này để tạo ra một UIImageView:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithCGImage:self.CGImage]]; 

Chỉ cần đảm bảo phát hành imageView sau khi bạn thêm nó làm chế độ xem phụ.

1
profileImageView.layer.cornerRadius = profileImageView.frame.size.height/2; 
profileImageView.clipsToBounds = YES; 
+1

Thay vì chỉ viết mã trần, nó sẽ giúp ích nếu bạn thêm một số giải thích là tại sao giải pháp của bạn là tốt nhất, hoặc cách giải quyết vấn đề. –

Các vấn đề liên quan