裁剪圖片踩的坑

之前的項(xiàng)目中有個(gè)需求:將一個(gè)比較長的列表頁(用的UITableView)截圖然后分享到微信。貼出實(shí)現(xiàn)方法:

- (UIImage *)captureScrollView:(UIScrollView *)scrollView {
    UIImage* image = nil;
    UIGraphicsBeginImageContext(scrollView.contentSize);
    {
        CGSize s = scrollView.contentSize;
        //第一個(gè)參數(shù)表示區(qū)域大小。第二個(gè)參數(shù)表示是否是非透明的。如果需要顯示半透明效果,需要傳NO,否則傳YES。第三個(gè)參數(shù)就是屏幕密度了,關(guān)鍵就是第三個(gè)參數(shù)。
        UIGraphicsBeginImageContextWithOptions(s, NO, [UIScreen mainScreen].scale);
        CGPoint savedContentOffset = scrollView.contentOffset;
        CGRect savedFrame = scrollView.frame;
        scrollView.contentOffset = CGPointZero;
        scrollView.frame = CGRectMake(0, 0, SCREEN_WIDTH, scrollView.contentSize.height);
        
        [scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
        image = UIGraphicsGetImageFromCurrentImageContext();
        
        scrollView.contentOffset = savedContentOffset;
        scrollView.frame = savedFrame;
    }
    UIGraphicsEndImageContext();
    
    if (image != nil) {
        return image;
    }
    return nil;
}

所截的圖如下:



這個(gè)方法能順利將tableView截成長圖,但是突然有天需求變了:

手續(xù)費(fèi)那一欄不能分享出去,What?

然后我的思路是截兩次,第一次把手續(xù)費(fèi)以上的部分截下來,第二次把手續(xù)費(fèi)以下的部分截出來,然后兩張圖片合成一張圖片。思路有了,操起鍵盤就是一梭子代碼:

/**
 Description 從圖片中按指定的位置大小截取圖片的一部分
 @param image 原始的圖片
 @param rect 要截取的區(qū)域
 @return 截取出的圖片
 */
- (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect{
    CGImageRef sourceImageRef = [image CGImage];//將UIImage轉(zhuǎn)換成CGImageRef
    /**以下為錯(cuò)誤寫法*/
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height));//按照給定的矩形區(qū)域進(jìn)行剪裁
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];//將CGImageRef轉(zhuǎn)換成UIImage
    return newImage;//返回剪裁后的圖片
}

/**
 Description 圖片上下拼接
 @param topImage 上圖片
 @param bottomImage 下圖片
 @return 拼接后的圖片
 */
- (UIImage *)composeImgWithTopImage:(UIImage *)topImage bottomImage:(UIImage *)bottomImage {
    if (bottomImage == nil) {
        return topImage;
    }
    CGFloat topImageH = topImage.size.height;
    CGFloat topImageW = topImage.size.width;
    CGFloat bottomImageH = bottomImage.size.height;
    CGFloat bottomImageW = bottomImage.size.width;
    
    CGFloat totalHeight = SCREEN_WIDTH*topImageH/topImageW + SCREEN_WIDTH*bottomImageH/bottomImageW;
    CGSize offScreenSize = CGSizeMake(SCREEN_WIDTH, totalHeight);
    UIGraphicsBeginImageContextWithOptions(offScreenSize, NO, [UIScreen mainScreen].scale);
    CGRect rectTop = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_WIDTH*topImageH/topImageW);
    [topImage drawInRect:rectTop];
    CGRect rectBottom = CGRectMake(0, SCREEN_WIDTH*topImageH/topImageW, SCREEN_WIDTH, SCREEN_WIDTH*bottomImageH/bottomImageW);
    [bottomImage drawInRect:rectBottom];
    UIImage* imagez = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return imagez;
}

然后我兩次調(diào)用截圖傳的rect是

CGRect headerClipRect = CGRectMake(0, 0, image.size.width, [self.tableView rectForSection:2].origin.y);
CGRect footerClipRect = CGRectMake(0, [self.tableView rectForSection:3].origin.y, image.size.width, self.tableView.contentSize.height - [self.tableView rectForSection:3].origin.y);

準(zhǔn)備就緒,來看看截出來的圖是什么樣子的:


image.png

what,我到底哪里錯(cuò)了?一臉驚恐

然后反復(fù)查找發(fā)現(xiàn)- (UIImage *)captureScrollView:(UIScrollView *)scrollView這個(gè)方法截出的長圖的大小并不是傳入的scrollView的contentSize,而是長寬各自乘以手機(jī)分辨率[UIScreen mainScreen].scale,所以對(duì)長圖進(jìn)行切割的時(shí)候,按照給定的矩形區(qū)域進(jìn)行剪裁應(yīng)該這樣傳值

CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, CGRectMake(rect.origin.x*[UIScreen mainScreen].scale, rect.origin.y*[UIScreen mainScreen].scale, rect.size.width*[UIScreen mainScreen].scale, rect.size.height*[UIScreen mainScreen].scale));//按照給定的矩形區(qū)域進(jìn)行剪裁

最后的截圖合成之后應(yīng)該是這樣的:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容