美文网首页
iOS正确裁剪图片的方法

iOS正确裁剪图片的方法

作者: 坚持_d49e | 来源:发表于2020-05-12 14:07 被阅读0次

    最近项目中涉及到一个裁剪图片的功能出了问题,而且是仅仅针对那特定的一张图片有问题。我们的需求是:如果图片不是正方形,则以较短边为边长裁剪成正方形图片。方法是之前写好的,一直用着没有问题,不知为什么现在这张图片就是裁剪有问题,只裁剪了部分图片。
    这就奇怪了,跟了一下代码发现代码逻辑本身没有问题啊,网上搜索了一下别人的写法也是一样,换成其他人的方法进行裁剪,发现问题是一样的。那就证明不是方法本身有问题,应该是这张图片有问题。那到底是什么问题呢?跟了好几次代码发现设置的图片大小也没有问题啊,那为什么只裁剪了部分图片?
    尝试:既然只裁剪了部分,那我试着把图片大小等比例放大看看裁剪后的图片是什么样子?结果发现图片裁剪部分跟着扩大了,虽然还是部分,但是这部分大了很多。一下子就明白了原因所在,应该是这张图片被等比例缩放了。再次查看UIImage的scale是3,那问题就明了了,这张特殊的图片是一张3倍图,平常我们裁剪的图片是一倍图,所以一倍图的时候获取图片的size大小没有问题,是真实的图片大小。当裁剪的图片是一张3倍图或者2倍图的时候,再获取图片的size就不是图片本身的真实大小了。所以就出现了我遇到的这个问题。

    结论:获取一张图片的大小不是size(虽然大多数情况下是正确的),图片的真实大小是image.size*image.scale。

    下面是正确的图片裁剪方法,供大家参考。
    // 以图片中心为中心,以最小边为边长,裁剪正方形图片

    +(UIImage *)cropSquareImage:(UIImage *)image{
    
    CGImageRef sourceImageRef = [image CGImage];//将UIImage转换成CGImageRef
    CGFloat _imageWidth = image.size.width * image.scale;
    CGFloat _imageHeight = image.size.height * image.scale;
    CGFloat _width = _imageWidth > _imageHeight ? _imageHeight : _imageWidth;
    CGFloat _offsetX = (_imageWidth - _width) / 2;
    CGFloat _offsetY = (_imageHeight - _width) / 2;
    CGRect rect = CGRectMake(_offsetX, _offsetY, _width, _width);
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);//按照给定的矩形区域进行剪裁
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    
    return newImage;
    }
    

    相关文章

      网友评论

          本文标题:iOS正确裁剪图片的方法

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