iOS中图片的处理函数

1.图片裁剪

#pragma mark - image clip method

- (void)clipImageView:(UIImageView *)imageView WithPath:(CGMutablePathRef)path
{
    CGRect rect = imageView.frame;
    
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextAddPath(context, path);
    CGContextClip(context);
    CGContextSaveGState(context);
    
    [imageView.image drawInRect:rect];
    
    imageView.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


}

2.像素压缩,该方法是基于UIImage的扩展

-(UIImage *)makeThumbnailWithScaleRate:(float)scaleRate
{
    NSLog(@"original---%@",CGSizeCreateDictionaryRepresentation(self.size));
    
    CGRect scaleRect = CGRectMake(0, 0, self.size.width*scaleRate, self.size.height*scaleRate);
    
    UIImageView *imageView=[[UIImageView alloc]initWithFrame:scaleRect];
    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.image=self;
    
    UIGraphicsBeginImageContext(scaleRect.size);
    
    [imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    UIImage*scaleImage = UIGraphicsGetImageFromCurrentImageContext();
    
    NSLog(@"%@",CGSizeCreateDictionaryRepresentation(scaleImage.size));
    
    return scaleImage;
}


3.拍照图片旋转

使用手机拍照后,取出的照片会因为拍摄时设备的使用方式不同,展现出倒立的、横向的等各种不符合期望的角度,所以经常需要将相册中的照片加工一下在展现,具体方法如下:

- (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;
}

4.图片自适应屏幕(这个方法不可靠,从很古老的日志里找到的,自己都不记得做什么用的了,先记下来,有空再细看)

-(UIImage *)imageFitScreen:(UIImage *)image
{
    UIImage *resultsImg;
    
    CGSize origImgSize = [image size];
    
    CGRect newRect;
    newRect.origin = CGPointZero;
    newRect.size = [[self view] bounds].size;
    CGRect r=newRect;
    r.size.width=WIDTH;
    newRect=r;

    
    //确定缩放倍数
    float ratio = MIN(newRect.size.width / origImgSize.width, newRect.size.height / origImgSize.height);
    
    UIGraphicsBeginImageContextWithOptions(newRect.size, YES, 1.0);

    CGRect rect;
    rect.size.width = ratio * origImgSize.width;
    rect.size.height = ratio * origImgSize.height;
    rect.origin.x = (newRect.size.width - rect.size.width) / 2.0;
    rect.origin.y = (newRect.size.height - rect.size.height) / 2.0;
    
    [image drawInRect:rect];
    
    resultsImg = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    return resultsImg;
    
}

5.截屏函数,基于uiview的扩展

@implementation UIView (Screenshot)

- (UIImage *)screenshot {
    CGFloat scale = [UIScreen screenScale];
	
    if(scale > 1.5) {
        UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, scale);
    } else {
        UIGraphicsBeginImageContext(self.frame.size);
    }
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenshot;
}

@end



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值