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

相关文章

  • iOS图片裁剪的一点感悟

    最近在改的需求,需要裁剪图片,然后网上各种搜索,终于寻得一个仿微信头像裁剪的demo,改一改基本OK。但是第一次裁...

  • 【iOS】图片裁剪

    【iOS】图片裁剪 Demo地址

  • [iOS] 图像处理:一种高效裁剪图片圆角的算法

    [iOS] 图像处理:一种高效裁剪图片圆角的算法 [iOS] 图像处理:一种高效裁剪图片圆角的算法

  • 【iOS】图片裁剪

    ####【iOS】图片裁剪 UIImage *imageTop=[UIImage imageNamed:@"111...

  • iOS 头像裁剪、图片裁剪、微信头像裁剪

    iOS 头像裁剪、图片裁剪、微信头像裁剪 关于图片裁剪,基本上所有涉及到c端用户带基本信息的App基本都会用到,使...

  • iOS裁剪图片

    工作中突然用到了压缩图片展示缩略图被压扁和拉伸的现象,于是先按比例压缩然后再进行裁剪。类似UIView中的UIVi...

  • iOS 图片裁剪

    1、开启位图上下文 2、获取上下文 3、对位图上下文添加裁剪的范围,并对齐裁剪 4、从位图上下文中获取已经裁剪的图...

  • iOS 图片裁剪

    写在前面:实际工作中,有时候需要按照需求将图片裁剪成圆形,或者你需要的形状。这里以圆形为例。 核心:void CG...

  • iOS图片裁剪

    在iOS开发过程中,经常会遇到上传图片的需求,有时获取到图片之后需要裁剪一下,而系统提供的方法只能裁剪出一个正方形...

  • iOS 图片裁剪

    图片裁剪根据需求自行设置newSize如果是等比例裁剪(宽高比不变的情况下),可将从相册或者相机拿到的图片获取im...

网友评论

  • 说好买辣椒:楼主,又碰到截图出来图片为空的吗
    无神:@都说了你最棒 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