iOS图片裁剪的一点感悟

作者: 无神 | 来源:发表于2015-11-18 20:32 被阅读4972次

    最近在改的需求,需要裁剪图片,然后网上各种搜索,终于寻得一个仿微信头像裁剪的demo,改一改基本OK。但是第一次裁剪完的图片有些模糊,网上看帖子,有人提议把UIGraphicsBeginImageContext(size);这行代码改成如下形式:UIGraphicsBeginImageContextWithOptions(size,NO,kDeviceScale);这样的话,加了屏幕分辨率,缩放以后准备裁剪的图片确实不模糊了,但是诞生了一个新的问题,明明图片已经调整到裁剪框的中心也缩放到了想要的内容范围,但是裁剪以后的结果是只有图片右上角的1/4,好苦逼啊,然后又是各种尝试,各种问大神,最后又是分辨率的问题,擦,想死的节奏!记录一下给需要用到裁剪功能的同学提个醒,与及给正在为此问题烦恼的同学予希望之光。

    - (UIImage *)getSubImage {
        
        CGRect squareFrame = self.cropFrame;
        
        CGFloat scaleRatio = self.latestFrame.size.width / self.originalImage.size.width;
        CGFloat x = (squareFrame.origin.x - self.latestFrame.origin.x) / scaleRatio;
        CGFloat y = (squareFrame.origin.y - self.latestFrame.origin.y) / scaleRatio;
        CGFloat w = squareFrame.size.width / scaleRatio;
        CGFloat h = squareFrame.size.width / scaleRatio;
        if (self.latestFrame.size.width < self.cropFrame.size.width) {
            CGFloat newW = self.originalImage.size.width;
            CGFloat newH = newW * (self.cropFrame.size.height / self.cropFrame.size.width);
            x = 0; y = y + (h - newH) / 2;
            w = newH; h = newH;
        }
        if (self.latestFrame.size.height < self.cropFrame.size.height) {
            CGFloat newH = self.originalImage.size.height;
            CGFloat newW = newH * (self.cropFrame.size.width / self.cropFrame.size.height);
            x = x + (w - newW) / 2; y = 0;
            w = newH; h = newH;
        }
        //乘以图片的分辨率,保证截到一张完整的图(分辨率:kDeviceScale)
        CGRect myImageRect = CGRectMake(x*kDeviceScale,y*kDeviceScale, w*kDeviceScale, h*kDeviceScale);
        CGImageRef imageRef = self.originalImage.CGImage;
        CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, myImageRect);
        CGSize size;
        size.width = myImageRect.size.width;
        size.height = myImageRect.size.height;
        //UIGraphicsBeginImageContext(size);
        //设置图片的分辨率,保证图片的清晰度(kDeviceScale)
        UIGraphicsBeginImageContextWithOptions(size,NO,kDeviceScale);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextDrawImage(context, myImageRect, subImageRef);
        UIImage *smallImage = [UIImage imageWithCGImage:subImageRef];
        CGImageRelease(subImageRef);
        UIGraphicsEndImageContext();
        return smallImage;
    }
    

    相关文章

      网友评论

      • 说好买辣椒:楼主,又碰到截图出来图片为空的吗
        无神:@都说了你最棒 OK,找到就好
        说好买辣椒:谢谢,画布开启太大了
        无神:@都说了你最棒 木有碰到过,你检查一下输入是否为空
      • 82295265a0fd:latestFrame cropFrame squareFrame这些参数 你能详细解释下么,楼主?
        无神:@0号故事 cropFrame 是裁剪区域的frame,latestFrame是缩放后最新的frame,cropframe是固定的,而lasteframe是动态变动的。
      • tinaH:裁剪完成的图片成功,但是显示的时候要显示原图怎么解决
        无神:@tinaH 不谢!
        tinaH:@无神 谢谢大神
        无神:@tinaH 你做一个中间变量,执行裁剪之前,使用中间变量保存原图,执行之后获取裁剪的图,就可以二者皆有了。:relaxed:
      • WHZ闹哪样:厉害了,可不可以分享个demo:pray:
        无神:不过注释好像不是很全,我会抽空在进行一下补充!
        无神:帖子里的代码已经是核心代码了,和demo基本别无二致了!
      • 28ee642ad938:楼主你好, self.originalImage请问这个是本身图片吗?
        无神:@Szhixing丶 右上角1/4是分辨率的问题,我文字里有说明!
        28ee642ad938:@无神 不知道为什么还是只显示4分之1....
        无神:@Szhixing丶 是的
      • ThaiLanKing:CGRect可以直接取size,为什么还定义了一个CGSize size;
        无神:@ThaiLanKing :sweat:,好吧!
        ThaiLanKing:@无神 那至少可以这么写:CGSize size = myImageRect.size;
        这两句感觉没什么必要:
        size.width = myImageRect.size.width;
        size.height = myImageRect.size.height;
        无神:@ThaiLanKing 这只是个人写代码的习惯而已,我不喜欢一大串连着写!中间变量代换一些我觉得更清晰!
      • Arongkuaile:大神、你好!kDeviceScale这个值是怎么得到的、我现在把裁剪框设置成长方形的,裁剪之后依然是正方形,裁剪的x,y坐标是缩放后的,就是高度会自动变成和宽度一样的大小。不知道是什么原因,是因为图片本身就是正方形,所以根据缩放比例之后仍然是正方形的原因吗???希望大神赐教!
        无神:@左耳的
        /**
        * 设备的点和像素的缩放比例
        */
        #define kDeviceScale [UIScreen mainScreen].scale
      • affa198c19d5:大神,你好!仿微信头像裁剪的demo,可以参考一下吗?谢谢大神
        无神:@moths 这个功能做的有点早了,后来电脑重装过系统,demo木有啦,你直接百度仿微信裁剪的demo貌似能搜到!
      • hczhhm:作者你好,我在看你的代码时有个疑问,希望您能帮我解答,latestFrame和cropFrame 如果我猜的没错的话,前者是图片裁剪后的Frame ,后者是裁剪框的Frame。不知道他们的区别在哪里,所以没敢直接拿代码过来用,希望您能帮我解答一下,谢谢。
        无神:@hczhhm 不谢,希望能帮你!
        hczhhm:@无神 恩恩,好的,谢谢
        无神:@hczhhm cropFrame 是裁剪区域的frame,latestFrame是缩放后最新的frame,cropframe是固定的,而lasteframe是动态变动的。

      本文标题:iOS图片裁剪的一点感悟

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