UIImage常用的分类

有些时候经常需要对系统本有的类方法进行扩充,于是可能需要对类采用继承或者分类的方式来实现需要。

最近写的一个项目用到了一些对图片进行处理的一些扩充方法。


涉及到的方法:



比较常用的类似于拉伸图片,拼接图片名称或者以颜色生成图片等。


拼接图片名称:

+ (UIImage *)imageMatchSizeWithName:(NSString *)imageName
{
    if (__Device_Iphone_5__)       //iphone5,5s
    {
        NSString *ext = [imageName pathExtension];
        
        imageName = [imageName stringByDeletingPathExtension];
        imageName = [imageName stringByAppendingString:@"-568h@2x"];
        imageName = [imageName stringByAppendingPathExtension:ext];
    }
    
    return [UIImage imageNamed:imageName];
}

通过宏来给图片名称拼接一个4寸标识。


拉伸图片到指定尺寸:

+ (UIImage *)compressImage:(UIImage *)imgSrc toSize:(CGSize)size
{
    UIGraphicsBeginImageContext(size);
    CGRect rect = {{0,0}, size};
    [imgSrc drawInRect:rect];
    UIImage *compressedImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return compressedImg;
}

通过上下文来绘制实现将图片拉伸到指定的尺寸。


指定位置获取像素点平铺拉伸图片

+ (UIImage *)strechImageWithName:(NSString *)imageName
{
    UIImage *image = [UIImage imageNamed:imageName];
    
    return [image stretchableImageWithLeftCapWidth:image.size.width*0.5 topCapHeight:image.size.height*0.5];
}

+ (UIImage *)strechImageWithName:(NSString *)imageName posX:(CGFloat)x posY:(CGFloat)y
{
    UIImage *image = [UIImage imageNamed:imageName];
    
    return [image stretchableImageWithLeftCapWidth:image.size.width*x topCapHeight:image.size.height*y];
}

这里涉及到一个端帽,不过如果不清楚只要知道是根据指定的像素位置平铺来实现拉伸即可。


截屏:

+ (UIImage *)screenshot
{
    CGSize imageSize = [[UIScreen mainScreen] bounds].size;
    
    if (NULL != UIGraphicsBeginImageContextWithOptions) {
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
    } else {
        UIGraphicsBeginImageContext(imageSize);
    }
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
        if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) {
            CGContextSaveGState(context);
            
            CGContextTranslateCTM(context, [window center].x, [window center].y);
            
            CGContextConcatCTM(context, [window transform]);
            
            CGContextTranslateCTM(context,
                                  -[window bounds].size.width * [[window layer] anchorPoint].x,
                                  -[window bounds].size.height * [[window layer] anchorPoint].y);
            
            [[window layer] renderInContext:context];
            
            CGContextRestoreGState(context);
        }
    }
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return image;
}


增加水印:

+ (UIImage *)addImage:(UIImage *)image addMsakImage:(UIImage *)maskImage maskFrame:(CGRect)pos
{
    UIGraphicsBeginImageContext(image.size);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    
    //水印图片的位置
    [maskImage drawInRect:pos];
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resultingImage;
}


指定颜色生成图片:

+ (UIImage *)imageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

以上三个方法其实均有些类似,都是通过图片上下文来进行操作。


相对于上述方法,进行模糊稍微麻烦一些,也可以使用CoreImage中的高斯模糊滤镜,CoreImage的简单使用可以参照之前的博客:

CoreImage的使用及常见滤镜工具(一)

+ (UIImage *)blurImage:(UIImage *)src amount:(CGFloat)amount
{
    if (amount < 0.0 || amount > 1.0) {
        amount = 0.5;
    }
    
    int boxSize = (int)(amount * 40);
    boxSize = boxSize - (boxSize % 2) + 1;
    
    CGImageRef img = src.CGImage;
    
    vImage_Buffer inBuffer, outBuffer;
    vImage_Error error;
    
    void *pixelBuffer;
    
    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
    
    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);
    
    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
    
    pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
    
    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) {
        error = vImageBoxConvolve_ARGB8888(&outBuffer, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
        
        if (!error) {
            error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
        }
    }
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    CGContextRef ctx = CGBitmapContextCreate(outBuffer.data,
                                             outBuffer.width,
                                             outBuffer.height,
                                             8,
                                             outBuffer.rowBytes,
                                             colorSpace,
                                             (CGBitmapInfo)kCGImageAlphaNoneSkipLast);
    
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
    
    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);
    
    free(pixelBuffer);
    CFRelease(inBitmapData);
    
    CGColorSpaceRelease(colorSpace);
    CGImageRelease(imageRef);
    
    return returnImage;
}
需要注意的是,这个方法需要导入系统库:<Accelerate/Accelerate.h>


实现即使不是太清楚,也可以直接拿来用就行。

资源位置

GitHub:UIImage-HR

CSDN:iOS图片分类



以上就是本篇博客全部内容,欢迎指正和交流。转载注明出处~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
UIImageiOS中用于表示图像的类,可以用它来加载、显示和处理图片。以下是使用UIImage的基本步骤: 1. 导入UIImage库 ```objective-c #import <UIKit/UIKit.h> ``` 2. 加载图片 ```objective-c UIImage *image = [UIImage imageNamed:@"imageName"]; ``` 3. 显示图片 ```objective-c UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; [self.view addSubview:imageView]; ``` 4. 处理图片 UIImage提供了一些方法来处理图片,例如裁剪、缩放、旋转等。以下是一些常用的方法: 裁剪图片 ```objective-c CGRect rect = CGRectMake(x, y, width, height); CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, rect); UIImage *newImage = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); ``` 缩放图片 ```objective-c CGSize newSize = CGSizeMake(width, height); UIGraphicsBeginImageContext(newSize); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); ``` 旋转图片 ```objective-c CGFloat radians = angle * M_PI / 180; CGAffineTransform transform = CGAffineTransformMakeRotation(radians); CGContextRef context = CGBitmapContextCreate(NULL, image.size.width, image.size.height, CGImageGetBitsPerComponent(image.CGImage), 0, CGImageGetColorSpace(image.CGImage), CGImageGetBitmapInfo(image.CGImage)); CGContextConcatCTM(context, transform); CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage); CGImageRef newImageRef = CGBitmapContextCreateImage(context); UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; CGContextRelease(context); CGImageRelease(newImageRef); ``` 以上是UIImage的基本使用方法,你可以根据自己的需要来进行更多的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值