文档章节

IOS — 对image的处理

轨迹的账号
 轨迹的账号
发布于 2017/04/24 15:31
字数 964
阅读 26
收藏 0

第一,对图片的重绘

-(UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize {

    UIGraphicsBeginImageContext(CGSizeMake(reSize.width,reSize.height));

    [image drawInRect:CGRectMake(0, 0, reSize.width,reSize.height)];

    UIImage *reSizeImage =UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return reSizeImage;

}

此方法是对图片按照一定的比例进行重绘,无需先移除再重新添加另外一个大小的imageView

优点:重绘图片可以减小图片的大小,并提高图片的清晰度,是对图片的处理中最常用的方法

第二,截取原图片固定比例的图片

A.第一种方法

- (UIImage *)getCutImageSize:(CGSize)size originalImage:(UIImage *)originalImage{

    originalImage = [self equalScaleCompressImage:originalImage size:size];

    CGImageRef imageRef = originalImage.CGImage;

 CGImageRef cutImageRef = CGImageCreateWithImageInRect(imageRef, [self getCutRectWithBigSize:originalImage.size cutRect:size]);

    UIGraphicsBeginImageContext(size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextDrawImage(context, [self getCutRectWithBigSize:originalImage.size cutRect:size], cutImageRef);

    UIImage *cutImage = [UIImage imageWithCGImage:cutImageRef];

    UIGraphicsEndImageContext();

    

    return cutImage;

}

 

//获取截图区域(从中心算起)

- (CGRect)getCutRectWithBigSize:(CGSize)bigSize cutRect:(CGSize)cutSize{

    CGPoint bigPoint = CGPointMake(bigSize.width / 2.0f, bigSize.height / 2.0f);

先获取中心点,再取得截图的rect

    CGRect Rect = CGRectMake(bigPoint.x - cutSize.width / 2.0f, bigPoint.y - cutSize.height / 2.0f, cutSize.width, cutSize.height);

    return Rect;

}

//等比压缩图片

//如果自动适应image的size  以宽、高最大值为主

- (UIImage *)equalScaleCompressImage:(UIImage *)bigImage size:(CGSize)size{

    CGFloat scale = [self getCompressScaleWithBigSize:bigImage.size smallSize:size];

    UIGraphicsBeginImageContext(CGSizeMake(bigImage.size.width * scale, bigImage.size.height * scale));

    [bigImage drawInRect:CGRectMake(0, 0, bigImage.size.width * scale, bigImage.size.height * scale)];

    UIImage *scaledImage =UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return scaledImage;

}

 

//获取压缩比scale

- (CGFloat)getCompressScaleWithBigSize:(CGSize)bigSize smallSize:(CGSize)smallSize{

    CGFloat scale;

    if (bigSize.height / bigSize.width >= smallSize.height / smallSize.width) {

        scale = smallSize.width / bigSize.width;

    }else{

        scale = smallSize.height / bigSize.height;

    }

    return scale;

}

B.第二种方法

//原图片

    UIImage * img = [UIImage imageNamed:@"ly3.jpg"];

    CGFloat imgWidth = CGImageGetWidth(img.CGImage);

    CGFloat imgHeight = CGImageGetHeight(img.CGImage);

    //转化为位图

    CGImageRef temImg = img.CGImage;

    //根据范围截图

    temImg=CGImageCreateWithImageInRect(temImg, CGRectMake(0, 0, 100, 100));

    //得到新的图片

    UIImage *new = [UIImage imageWithCGImage:temImg];

    //释放位图对象

    CGImageRelease(temImg);

    

    UIImageView * oldImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 20, imgWidth, imgHeight)];

    oldImageView.contentMode = UIViewContentModeScaleAspectFill;

    oldImageView.image = img;

    [self.view addSubview:oldImageView];

第三,图片的模糊效果

UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(width/2, 0, width, height)];

    toolBar.barStyle = UIBarStyleDefault;

    toolBar.translucent = YES;

    [bgImageView addSubview:toolBar];

最常用

    UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

    UIVisualEffectView *effectView = [[UIVisualEffectView alloc]initWithEffect:effect];

    effectView.frame = CGRectMake(width/2, 0, width, height);

    [bgImageView addSubview:effectView];

第四种,高斯模糊

//效果:第一种Core Image设置模糊之后会在周围产生白边,vImage使用不存在任何问题;

//性能:图像模糊处理属于复杂的计算,大部分图片模糊选择的是vImage,性能最佳

//blur变模糊

+(UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur{

   // CIContext 是一个对象,通过它Core Image可以绘制一个CIFilter产生的结果。一个Core Image Context可以基于CPU或GPU

    CIContext *context = [CIContext contextWithOptions:nil];

    //CIImage 是一个不变对象,代表一个图片。你可以通过图像数据,或者通过文件,或者另一个CIFilter对象的输出得到一个CIImage。

    CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];

//CIFilter 是一个可变对象,代表一种效果。一个滤镜对象至少要有一个输入参数,并产生一个输出图片   CIGaussianBlur  高斯模糊

    //设置filter

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

    //释放掉CGImageRef

    CGImageRelease(outImage);

    return blurImage;

}

//vImage属于Accelerate.Framework,需要导入 Accelerate下的 Accelerate头文件, Accelerate主要是用来做数字信号处理、图像处理相关的向量、矩阵运算的库。图像可以认为是由向量或者矩阵数据构成的,Accelerate里既然提供了高效的数学运算API,自然就能方便我们对图像做各种各样的处理 ,模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数。

//大部分图片模糊选择的是vImage,性能最佳

+(UIImage *)boxblurImage:(UIImage *)image withBlurNumber:(CGFloat)blur

{

    if (blur<0||blur>1) {

        blur = 0.5;

    }

    

    int boxSize = (int)(blur * 40);

    boxSize = boxSize - (boxSize % 2) + 1;

    

    CGImageRef img = image.CGImage;

    

    vImage_Buffer inBuffer, outBuffer;

    vImage_Error error;

    

    void *pixelBuffer;

    

    CGDataProviderRef inProvide = CGImageGetDataProvider(img);

    CFDataRef inBitmapData = CGDataProviderCopyData(inProvide);

    

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

    

    CGContextRelease(ctx);

    CGColorSpaceRelease(colorSpace);

    

    free(pixelBuffer);

    CFRelease(inBitmapData);

    

    CGColorSpaceRelease(colorSpace);

    CGImageRelease(imageRef);

    

    return returnImage;

}

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 圆角设置
轨迹的账号
粉丝 2
博文 8
码字总数 4053
作品 0
德州
私信 提问
fir.im Weekly - iOS 开发中的 Git 流程

本期 fir.im Weekly 收集了微博上的热转资源,包含 Android、iOS 开发工具、源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用。 精仿知乎日报 iOS 端 @我偏笑_NSNirvana花了将近一...

风起云飞fir_im
2015/11/03
0
0
iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd
2018/04/17
0
0
iOS简单音乐实现、React-Native完整项目、仿闲鱼京东列表分页、语音识别、网络加载过度动画等源码

iOS精选源码 iOS快速入手语音识别、听写、评测、播报 网络加载数据的过渡动画(仿简书网页) iOS 封装跑马灯和轮播效果 crash防护组件,适用常见常用的数组,字典等crash保护 iOS:高仿闲鱼、...

Code4app
2018/09/26
0
0
iOS 开发中如何使用半透明模糊效果

虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用。包括最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开始大量使用...

暗梦寒云
2015/10/21
3K
1
iOS运营级B2B服务平台App、自定义图标库、个人中心页面、识别身份证Demo、瀑布流等源码

iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画(http://www.code4app.com/thread-10860-1-1.html) 一个近乎完整的可识别中国身份证信息的Demo 可自动快速...(http://www.code4a...

Android爱开源
2018/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【git工具】git bash

添加别名命令 git bash 下添加 alias: windows 工具:git bash 下添加 alias 配置文件 \Git\etc\bash.bashrc 即可,在gitbash工具目录下的 etc目录下 如: 让git log 命令 简化成 gl,配置如...

echojson
16分钟前
0
0
为什么做java开发的公司需要那么多程序员?

透过现象看本质。 Java是企业应用市场的王者,如果一家非互联网公司用Java,那么十有八九是做企业应用的。 所以,这个问题本质上是:为什么做企业应用的公司需要那么多Java程序员。 开发企业...

老道士
19分钟前
0
0
Go Timer实现原理剖析

简介 快速使用 操作介绍

恋恋美食
38分钟前
2
0
记录一个奇怪的问题

环境:jdk1.8虚拟机参数:-verbose:gc -XX:+PrintGCDetails -Xmx20m -Xms20m -Xmn10m -XX:SurvivorRatio=8  -XX:+HeapDumpOnOutOfMemoryError 可以看出,eden占8M却放不下6M数据,发生了......

暗中观察
今天
2
0
rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部