在我们写程序中,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.y = 0;
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