中级篇第十期:UIImage的处理

在我们开发过程中,经常会遇到对UIImage的处理,那么在这里简单介绍几种常用的吧,我一般把它们统一写在UIImage的Category中

首先是对图片的压缩处理

 
- (UIImage *)scaledImageWithSize:(CGSize)size {
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

然后是拍照后图片翻转的处理

 
- (UIImage *)fixOrientation:(UIImage *)aImage {
    //纠正图片
    if (aImage.imageOrientation == UIImageOrientationUp)
        return aImage;
    
    
    CGAffineTransform transform = CGAffineTransformIdentity;
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;
            
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;
            
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
        default:
            break;
    }
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
            
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
        default:
            break;
    }
    
    CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
                                             CGImageGetBitsPerComponent(aImage.CGImage), 0,
                                             CGImageGetColorSpace(aImage.CGImage),
                                             CGImageGetBitmapInfo(aImage.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (aImage.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
            break;
        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
            break;
    }
    
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    
    return img;
}

以及截取某图片上面的部分区域

 
- (CGImageRef)imageRefCutFromImage:(UIImage *)image {
    CGFloat scaleImg = image.size.width/image.size.height;
    CGRect rect = CGRectMake(0, 0, image.size.width*image.scale, image.size.width*image.scale);
    if (scaleImg > 1) {
        CGFloat originX = (image.size.width*image.scale - image.size.height * image.scale)/2;
        rect = CGRectMake(originX, 0, image.size.height * image.scale, image.size.height * image.scale);
    }else
    {
        rect = CGRectMake(0, 0, image.size.width*image.scale, image.size.width*image.scale);
    }
    CGImageRef cgimg = CGImageCreateWithImageInRect([image CGImage], rect);
    
    return cgimg;
}

就写这么多吧,等以后遇到新问题,再来继续解释

时间: 2024-10-12 16:46:44

中级篇第十期:UIImage的处理的相关文章

中级篇第六期:若隐若现的NavigationBar

我们就要如下图的效果哦,就是让NavigationBar随着滑动而出现与隐藏,就是那种若隐若现的感觉,感觉棒棒哒,哈哈 废话不多说咯,上代码咯 首先呢,我们要创建TableView还要给它指定一个HeaderView,然后再开始我们接下来的事情       UIView *backGroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(tableView.frame), 80)];     backGr

中级篇第七期:ScrollView常用练习

那么小弟这次的练习就是在ScrllView里面放入两个TableView,然后通过ScrollView的滑动实现两个TableView的互转,接下来再增加两个Button,来实现选中与非选中,然后关联按钮与ScrollView的滑动,并且同时关联滑动后按钮改变状态的一个简单例子 这种小Demo在实际开发中会经常遇到,所以,小伙伴们可以根据这个继续做开发调研,继续增加新的功能,毕竟每个产品中的功能都不相同,需要我们自己去拓展 废话不多说,直接上代码 首先创建一个ScrollView,并设置它的常用

中级篇第十一期:计时器的使用

在这里主要介绍三种计时器吧,毕竟用的情况不是很多 首先是NSTimer       NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeUp) userInfo:nil repeats:YES];     //解决timer方法延迟调用的情况     [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefa

初级篇第十期:学习查看View的层级关系

学习建议:自己动手,丰衣足食 学习周期:1周 学习目的:熟练使用Debug View Hierarchy查看View的层级关系 学习答疑:欢迎来技术群里提问并做分享 学习工具:Xcode开发环境,iOS8+ 学习内容:熟悉Xcode自带视图管理工具 这个功能很强大,早起只有收费软件Reveal可以来很好的调节iOS上UI界面的问题,那么在iOS8出来以后呢,Xcode6又更新出来一个功能,算是自带工具吧,与Reveal是类似的,不管你用IB还是纯代码,都是可以通过这个工具来查看当前程序运行界面中

进阶篇第十期:单例的运用

说起单例,小伙伴们应该并不陌生了吧,它是设计模式中的一种,iOS开发中比较常见 说一下我们为什么要用单例吧 主要是我们想在项目的运行过程中,一直持有某个对象的内存,而不去释放它,随用随拿 但是要注意的地方就是初始化的时候,请不要在初始化方法里面添加耗时操作,只要添加一些较简单的就好 比如我们在做一个功能,类似百度贴吧的发帖功能吧,那么这里的发帖又分为在某贴吧.某群组.某个圈子去发帖,或者说发的帖子要删掉,发送失败的帖子要保存,好多复杂的逻辑 那么这时候我们就要去选择单例来处理,因为我们随时可调,

中级篇第五期:初识UIScrollView

UIScrollView是我们在iOS开发中最常用的UI控件之一,包括它的子类tableView也是非常常用呢,那么本期小弟就来介绍一下UIScrollView的基础知识咯 在我们工作当中呢,有很多功能都是基于ScrollView的基础上的,所以我们要先了解系统的ScrollView到底能做哪些事情呢 首先初始化一个ScrollView       UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(

中级篇第四期:初识GCD

谈到GCD,相信小伙伴们一点都不陌生,没错,我们在项目开发过程中最常用的线程处理就是它咯,相信好多小伙伴们对其的运用以及炉火纯青了哦,下面小弟呢,就再次简单介绍一下它的各个常用的方法吧 并发队列在后台开启线程执行    __block NSInteger num = 0;  dispatch_async(dispatch_get_global_queue(0, 0), ^{      num++;      NSLog(@"async1 = %ld", num);  });  NSLo

经验篇第十期:群里的那点事儿(十)

问题1:关于多个界面调用回调的问题 欢迎小伙伴们常来群里提出技术问题~~并且帮他人解决问题哦

娱乐篇第十期:互联网的事情you意思(十)

暗黑3的解密奶牛事件还是蛮有意思的,箱子比较多,主要是纪念D2 炉石传说高手的牌组真是越来越犀利,借鉴都借鉴不过来呢,感觉变化蛮多的,打法多变哦 特别是炉石传说里面的竞技场,小伙伴们有时间的话一定要来搓上几局哦