圖片旋轉加圖上圓角

    在作通信錄頁面的時候,頭像須要圓角顯示,使用layer的方式雖然也能夠實現可是會比較卡。因此找了另一種方法,可是也有個問題是,用戶橫着手機拍照的照片作頭像的話,會被自動旋轉,雖然也有相應的方法解決,可是太慢了,旋轉一張圖片須要1.2秒左右。不知道有沒有高手能夠解決這個問題。另外想到一種辦法,可是還沒試的,就是在gcd裏面使用layer的方法給UImageView畫圓角,不知道這樣是否有風險。 api

UIView加圓角會卡的解決辦法

作iOS開發的時候有可能常常碰到莫名其妙的滑動不暢(在UIScrollView以及其子類)或者在navigation切換的時候不暢的問題,這頗有多是在界面中加了太多帶圓角而且masksToBounds爲YES的UIView而引發的。  app

暫時全部版本的api都沒有解決這個問題。所以若是想要避免這個問題,只能放棄在UIView上加圓角,若是該View是用來顯示圖片的,則能夠將該UIView上的圖片自己加圓角。  spa

  1. 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);  // 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  
        CGContextClosePath(context);  
        CGContextRestoreGState(context);  
    }  
      
    + (id) createRoundedRectImage:(UIImage*)image size:(CGSize)size  
    {  
        // the size of CGContextRef  
        int w = size.width;  
        int h = size.height;  
          
        UIImage *img = image;  
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
        CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);  
        CGRect rect = CGRectMake(0, 0, w, h);  
        CGContextBeginPath(context);  
        addRoundedRectToPath(context, rect, 10, 10);  
        CGContextClosePath(context);  
        CGContextClip(context);  
        CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);  
        CGImageRef imageMasked = CGBitmapContextCreateImage(context);  
        CGContextRelease(context);  
        CGColorSpaceRelease(colorSpace);  
        return [UIImage imageWithCGImage:imageMasked];  
    }

將UIView上的圖片用該方法處理一次,就能夠得到帶了圓角的圖片了。 code


解決UIImage圖片旋轉

iOS程序中使用系統相機拍照和從相冊選取圖片,直接上傳後在非mac系統下看到的圖片會發生旋轉的現象,那是由於咱們沒有經過圖片的旋轉屬性修改圖片倒置的。下面的方法能夠很簡單的解決旋轉問題: orm

@interface UIImage (fixOrientation)
   
- (UIImage *)fixOrientation;
   
@end
   
   
   
@implementation UIImage (fixOrientation)
   
- (UIImage *)fixOrientation {
   
    // No-op if the orientation is already correct
    if (self.imageOrientation == UIImageOrientationUp) return self;
   
    // We need to calculate the proper transformation to make the image upright.
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
    CGAffineTransform transform = CGAffineTransformIdentity;
   
    switch (self.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;
   
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;
   
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, self.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
    }
   
    switch (self.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
   
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
    }
   
    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                             CGImageGetBitsPerComponent(self.CGImage), 0,
                                             CGImageGetColorSpace(self.CGImage),
                                             CGImageGetBitmapInfo(self.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (self.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
            break;
   
        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
            break;
    }
   
    // And now we just create a new UIImage from the drawing context
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}
   
@end
相關文章
相關標籤/搜索