1. 程式人生 > >iOS 圖片模糊處理和自動獲取圖片尺寸

iOS 圖片模糊處理和自動獲取圖片尺寸

1.圖片模糊處理:

方法一:

+ (UIImage *)coreBlurImage:(UIImage *)image
           withBlurNumber:(CGFloat)blur {
    
    CIContext *context = [CIContext contextWithOptions:nil];
    CIImage  *inputImage=[CIImage imageWithCGImage:image.CGImage];

    CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
    [filter setValue:inputImage forKey:kCIInputImageKey];
    [filter setValue:@(blur) forKey: @"inputRadius"];
    //模糊圖片
    CIImage *result=[filter valueForKey:kCIOutputImageKey];
    CGImageRef outImage=[context createCGImage:result fromRect:[result extent]];
    UIImage *blurImage=[UIImage imageWithCGImage:outImage];
    CGImageRelease(outImage);
    return blurImage;
}

這是在網上所出來最多的一個方法,但是在使用的時候發現非常消耗效能,會阻塞主執行緒,效果很差。

方法二:

+ (UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur {
    if (blur < 0.f || blur > 1.f) {
        blur = 0.5f;
    }
    int boxSize = (int)(blur * 40);
    boxSize = boxSize - (boxSize % 2) + 1;
    
    CGImageRef img = image.CGImage;
    
    vImage_Buffer inBuffer, outBuffer;
    vImage_Error error;
    
    void *pixelBuffer;
    //從CGImage中獲取資料
    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
    //設定從CGImage獲取物件的屬性
    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);
    
    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
    
    pixelBuffer = malloc(CGImageGetBytesPerRow(img) *
                         CGImageGetHeight(img));
    
    if(pixelBuffer == NULL)
        NSLog(@"No pixelbuffer");
    
    outBuffer.data = pixelBuffer;
    outBuffer.width = CGImageGetWidth(img);
    outBuffer.height = CGImageGetHeight(img);
    outBuffer.rowBytes = CGImageGetBytesPerRow(img);
    
    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
    
    if (error) {
        NSLog(@"error from convolution %ld", error);
    }
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(
                                             outBuffer.data,
                                             outBuffer.width,
                                             outBuffer.height,
                                             8,
                                             outBuffer.rowBytes,
                                             colorSpace,
                                             kCGImageAlphaNoneSkipLast);
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
    
    //釋放C物件
    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);
    
    free(pixelBuffer);
    CFRelease(inBitmapData);
    CGImageRelease(imageRef);
    
    return returnImage;
}
這個方法在效能上就好了很多,非常流程

2.自動獲取圖片尺寸

方法一:

-(void)test1{
    UIImageView * imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Irelia_0.jpg"]];
    [imageView sizeToFit];
    NSLog(@"%@", NSStringFromCGRect(imageView.frame));
}
這個方法主要是通過sizeToFit獲取imageView的尺寸

方法二:

-(void)test2{
    UIImageView * imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Irelia_0.jpg"]];
    CGImageRef img = imageView.image.CGImage;
    
    CGFloat imageWidth = (CGFloat)CGImageGetWidth(img);
    CGFloat imageHeight = (CGFloat)CGImageGetHeight(img);
    
    NSLog(@"imageWidth:%f====imageHeight:%f", imageWidth, imageHeight);
}
這個方法主要是通過CGImageGetWidth和CGImageGetHeight來獲取image的尺寸