美文网首页攻城狮iOS日常知识储备iOS 开发每天分享优质文章
iOS图片 缩放、剪裁、自适应剪裁、保存到相册

iOS图片 缩放、剪裁、自适应剪裁、保存到相册

作者: JerryLMJ | 来源:发表于2016-03-09 11:24 被阅读13789次

缩放

/**
 *将图片缩放到指定的CGSize大小
 * UIImage image 原始的图片
 * CGSize size 要缩放到的大小
 */
+(UIImage*)image:(UIImage *)image scaleToSize:(CGSize)size{
    
    // 得到图片上下文,指定绘制范围
    UIGraphicsBeginImageContext(size);
    
    // 将图片按照指定大小绘制
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    
    // 从当前图片上下文中导出图片
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    
    // 当前图片上下文出栈
    UIGraphicsEndImageContext();
    
    // 返回新的改变大小后的图片
    return scaledImage;
}

通过实际效果来看,利用此方法缩放操作对图片的画质是有一定影响的。

剪裁

/**
 *从图片中按指定的位置大小截取图片的一部分
 * UIImage image 原始的图片
 * CGRect rect 要截取的区域
 */
+(UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect{
    
    //将UIImage转换成CGImageRef
    CGImageRef sourceImageRef = [image CGImage];
    
    //按照给定的矩形区域进行剪裁
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
    
    //将CGImageRef转换成UIImage
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    
    //返回剪裁后的图片
    return newImage;
}

自适应剪裁

一般当我们得到一个大图,但并不想把原图画到画布上,而是要按照一定比例将原图的一部分画到画布上。注意这里是指通过绘制的方式显示图片而不是UIImageView,因为UIImageView提供了类似自适应的方法。
这个操作其实只需要我们做一个宽高比的判断就可以

/**
 *根据给定的size的宽高比自动缩放原图片、自动判断截取位置,进行图片截取
 * UIImage image 原始的图片
 * CGSize size 截取图片的size
 */
-(UIImage *)clipImage:(UIImage *)image toRect:(CGSize)size{

    //被切图片宽比例比高比例小 或者相等,以图片宽进行放大
    if (image.size.width*size.height <= image.size.height*size.width) {
        
        //以被剪裁图片的宽度为基准,得到剪切范围的大小
        CGFloat width  = image.size.width;
        CGFloat height = image.size.width * size.height / size.width;
       
        // 调用剪切方法 
        // 这里是以中心位置剪切,也可以通过改变rect的x、y值调整剪切位置
        return [self imageFromImage:image inRect:CGRectMake(0, (image.size.height -height)/2, width, height)]; 
        
    }else{ //被切图片宽比例比高比例大,以图片高进行剪裁
        
        // 以被剪切图片的高度为基准,得到剪切范围的大小
        CGFloat width  = image.size.height * size.width / size.height;
        CGFloat height = image.size.height;
        
        // 调用剪切方法
        // 这里是以中心位置剪切,也可以通过改变rect的x、y值调整剪切位置
        return [self imageFromImage:image inRect:CGRectMake((image.size.width -width)/2, 0, width, height)];
    }
    return nil;
}

保存到相册

// Adds a photo to the saved photos album.  The optional completionSelector should have the form:
//  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo) __TVOS_PROHIBITED;
// 保存图片
- (void)saveImageToPhotosAlbum:(UIImage*)image{
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    
    if(error != NULL){
        // 保存图片失败

    }else{
        // 保存图片成功

    }
}

版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

相关文章

  • #import <Photos/Photos.h>

    import  iOS图片 缩放、剪裁、自适应剪裁、保存到相册  从P...

  • iOS图片 缩放、剪裁、自适应剪裁、保存到相册

    缩放 通过实际效果来看,利用此方法缩放操作对图片的画质是有一定影响的。 剪裁 自适应剪裁 一般当我们得到一个大图,...

  • iOS图片剪裁

    项目中需要对图片进行裁剪操作,所以封装了一个简单的剪裁图片的控件,当时的设想是能够根据剪裁框的区域自动放大或缩小,...

  • 解决小米6 系统调用相册或者拍照后无法剪裁的问题

    项目在其他手机运行正常,在小米6 上出现了问题,从系统相册或者拍照后对图片进行剪裁,导致相片无法剪裁,此时按剪裁或...

  • 剪裁框和图片剪裁

    图片处理中经常用的图片剪裁,就是通过剪裁框确定图片剪裁的区域,然后剪去该区域的图片,今天实现了一下,其实图片剪裁本...

  • 图片剪裁

    做项目是经常会遇见需要对图片进行剪裁的情况,下面来点干货 是不是很简单啊,end。。。。

  • 剪裁图片

    -(UIImage *)imageWithImage:(UIImage *)image sizeScaletoSi...

  • 图片剪裁

    图片剪裁

  • iOS 图片压缩和剪裁

    创建BitMap图形上下文的方法: 讲解上面的四个方法: UIGraphicsBeginImageContext ...

  • 第一堂:剪裁工具Crop Tool

    视频 剪裁工具(Crop Tool) 使用Crop Tool可以剪裁图片,旋转图片,和重新构图。 场景1)若图片中...

网友评论

  • astring:请问截取到时只是截取了一个view却没有截取到view上的图像怎么回事?
  • IMKel:楼主,请问如何才能做到压缩不变形啊,就是等比例压缩,怎么整
    IMKel:@MajorLMJ 我感觉这个质量压缩好鸡肋,压缩上传到网上再下载下来,发现图片体积还变大了
    JerryLMJ:要是质量压缩可以使用UIImageJPEGRepresentation(UIImage * __nonnull image, CGFloat compressionQuality);
    等比例压缩用博文里第一个提到的缩放就可以啦
  • 3c2944ca654b:+(UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect{

    //将UIImage转换成CGImageRef
    CGImageRef sourceImageRef = [image CGImage];

    //按照给定的矩形区域进行剪裁
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);

    //将CGImageRef转换成UIImage
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    // 调用这个方法 否则会造成内存泄漏 楼主可以检测下
    CGImageRelease(newImageRef);

    //返回剪裁后的图片
    return newImage;
    }
  • 微光星芒: [cameraView captureImage:^(BOOL finished, UIImage *captureImage) {
    if (finished) {
    CGFloat viewWidth = (SCREEN_WIDTH - 40);
    CGFloat viewHeight = 4 *viewWidth/3;
    UIImage *image = [self cutImage:captureImage withRect:CGRectMake(20, 20, viewWidth, viewHeight)];
    UIImage *image1 = [[UIImage alloc]initWithCGImage:[image CGImage] scale:1 orientation:UIImageOrientationRight];

  • 微光星芒:没有,我是用相机拍照,得到这张照片,然后剪裁这张图片的一部分; 对这张图片剪裁后,总是会有偏移;不知道楼主有没有处理过这样的场景?
  • 微光星芒:楼主,我使用这个剪裁方法 +(UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect , 不论rect设置为多少,从左侧总是从0开始剪裁;请问楼主出现过这类问题吗?
    微光星芒:@意林 O__O "… 一年后的评论 现在好像没用这个方法了; 谢谢了.
    e8b6cbadf7fb:你仔细看一下他的clipImage方法x或者y是从0开始的呀,所以得到的图片肯定是会偏移的
    JerryLMJ:@微光星芒 是不是你的rect的size大于你的图片的size了

本文标题:iOS图片 缩放、剪裁、自适应剪裁、保存到相册

本文链接:https://www.haomeiwen.com/subject/oegzkttx.html