iOS圖片 縮放、剪裁、自適應剪裁、保存到相冊

縮放

/**
 *將圖片縮放到指定的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;
}

通過實際效果來看,利用此方法縮放操作對圖片的畫質(zhì)是有一定影響的。

剪裁

/**
 *從圖片中按指定的位置大小截取圖片的一部分
 * UIImage image 原始的圖片
 * CGRect rect 要截取的區(qū)域
 */
+(UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect{
    
    //將UIImage轉(zhuǎn)換成CGImageRef
    CGImageRef sourceImageRef = [image CGImage];
    
    //按照給定的矩形區(qū)域進行剪裁
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
    
    //將CGImageRef轉(zhuǎn)換成UIImage
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    
    //返回剪裁后的圖片
    return newImage;
}

自適應剪裁

一般當我們得到一個大圖,但并不想把原圖畫到畫布上,而是要按照一定比例將原圖的一部分畫到畫布上。注意這里是指通過繪制的方式顯示圖片而不是UIImageView,因為UIImageView提供了類似自適應的方法。
這個操作其實只需要我們做一個寬高比的判斷就可以

/**
 *根據(jù)給定的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;
       
        // 調(diào)用剪切方法 
        // 這里是以中心位置剪切,也可以通過改變rect的x、y值調(diào)整剪切位置
        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;
        
        // 調(diào)用剪切方法
        // 這里是以中心位置剪切,也可以通過改變rect的x、y值調(diào)整剪切位置
        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技術博客的原創(chuàng)作品 ,轉(zhuǎn)載時必須注明出處及相應鏈接!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容