在ios中的按比例图片裁剪(自动根据你的imageView裁剪图片)

在我们写程序中,UIImageView 主要有fit(自动适合)和fill(全部铺满)2种。可如果你的imageView的大小与你拿到的图片尺寸不符合,(本地图片还好说,让美工做符合的图片就行了。如果是从服务器,例如优拍云上获取图片)如果使用fit,不会填满你的imageView,要是使用fill,图片会拉伸变形。这都是不可以的。所以我们可能会需要一个裁剪图片的函数,让它能够根据我的imageView来裁剪图片。我不关心我从服务器上获取的图片是多大的,我的目的是让我的客户端imageView能够把这张图片按图片本来的比例显示。可能会截掉图片上下或左右的一部分。裁剪时是从图片的中心往外扩散,根据我的算法截掉上下或左右的一部分,以保证图片显示比例不变,我们保证的是imageView的长宽比与图片所给的长宽比是一致的,所以把图片裁剪成符合UIImageView的长宽比。这样直接把self.imageView.image  = 裁剪后的image就可以了。由于我们是保持图片中心不变的,所以截去的都是边缘部分,这样最大的保证了图片的完整性。好了,不多说了,上代码:


//这里的self指的是UIimageView。我这里的self继承了UIImageVIew

newImage指的是我从服务器上拿到的图片

- (void)scaleImageForSelf:(UIImage *)newImage

{


    CGSize size;

    size.width = self.frame.size.width ;

    size.height = (self.frame.size.width * image.size.height) /image.size.width ;

    UIImage *newImage = [image scaleToSize:size];  

    

    CGFloat srcRatio = newImage.size.height/newImage.size.width;

    CGFloat desRatio = self.frame.size.height/self.frame.size.width;

    

    CGRect rect;

    if(srcRatio > desRatio){ //截上下,宽一致

        CGFloat ratio = newImage.size.width/self.frame.size.width;//缩放比

        rect.size.height = self.frame.size.height * ratio ;

        rect.size.width = newImage.size.width;

        rect.origin.x = 0;

        rect.origin.y = (newImage.size.height - self.frame.size.height)/2.0;

        self.image = [newImage getSubImage:rect];  

    }else if (srcRatio < desRatio)

   //截左右,高一致

    {

        CGFloat ratio = newImage.size.height/self.frame.size.height;

        rect.size.width = self.frame.size.width * ratio;

        rect.size.height = newImage.size.height ;

        rect.origin.x =newImage.size.width - self.frame.size.width/2.0;

        rect.origin.y0;

        

        self.image = [newImage getSubImage:rect];

    }else

    {

        self.image = newImage;//得到的图片的长宽比与iamgeView的长宽比一致,不用裁剪

    }


}


#import <Foundation/Foundation.h>


@interface UIImage(UIImageScale)

-(UIImage*)getSubImage:(CGRect)rect;

@end


下面的是上面所用到的按rect裁剪图片,基本使用的是系统方法。上面得到的是我想要在截取在图片中的rect

#import "UIImage.h"


@implementation UIImage(UIImageScale)


-(UIImage*)getSubImage:(CGRect)rect

{

    CGImageRef subImageRef = CGImageCreateWithImageInRect(self.CGImage, rect);

    CGRect smallBounds = CGRectMake(0, 0, CGImageGetWidth(subImageRef), CGImageGetHeight(subImageRef));

    

    UIGraphicsBeginImageContext(smallBounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextDrawImage(context, smallBounds, subImageRef);

    UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];

    UIGraphicsEndImageContext();

    

    return smallImage;

}

@end

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值