截取UIImage指定大小區域
最近遇到這樣的需求:從服務器獲取到一張照片,只需要顯示他的左半部分,或者中間部分等等。也就是截取UIImage指定大小區域。
UIImage擴展:
我的解決方案是對UIImage進行擴展。通過CGImageRef和CGImage完成截取,調用的方法是:CGImageCreateWithImageInRect。擴展類叫UIImage+Crop,具體代碼如下:
UIImage+Crop.h
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, XYCropImageStyle){
XYCropImageStyleRight =0, // 右半部分
XYCropImageStyleCenter =1, // 中間部分
XYCropImageStyleLeft =2, // 左半部分
XYCropImageStyleRightOneOfThird =3, // 右側三分之一部分
XYCropImageStyleCenterOneOfThird =4, // 中間三分之一部分
XYCropImageStyleLeftOneOfThird =5, // 左側三分之一部分
XYCropImageStyleRightQuarter =6, // 右側四分之一部分
XYCropImageStyleCenterRightQuarter =7, // 中間右側四分之一部分
XYCropImageStyleCenterLeftQuarter =8, // 中間左側四分之一部分
XYCropImageStyleLeftQuarter =9, // 左側四分之一部分
};
@interface UIImage (Crop)
- (UIImage *)imageByCroppingWithStyle:(XYCropImageStyle)style;
@end
UIImage+Crop.m
#import "UIImage+Crop.h"
@implementation UIImage (Crop)
- (UIImage *)imageByCroppingWithStyle:(XYCropImageStyle)style
{
CGRect rect;
switch (style) {
case XYCropImageStyleLeft:
rect = CGRectMake(0, 0, self.size.width/2, self.size.height);
break;
case XYCropImageStyleCenter:
rect = CGRectMake(self.size.width/4, 0, self.size.width/2, self.size.height);
break;
case XYCropImageStyleRight:
rect = CGRectMake(self.size.width/2, 0, self.size.width/2, self.size.height);
break;
case XYCropImageStyleLeftOneOfThird:
rect = CGRectMake(0, 0, self.size.width/3, self.size.height);
break;
case XYCropImageStyleCenterOneOfThird:
rect = CGRectMake(self.size.width/3, 0, self.size.width/3, self.size.height);
break;
case XYCropImageStyleRightOneOfThird:
rect = CGRectMake(self.size.width/3*2, 0, self.size.width/3, self.size.height);
break;
case XYCropImageStyleLeftQuarter:
rect = CGRectMake(0, 0, self.size.width/4, self.size.height);
break;
case XYCropImageStyleCenterLeftQuarter:
rect = CGRectMake(self.size.width/4, 0, self.size.width/4, self.size.height);
break;
case XYCropImageStyleCenterRightQuarter:
rect = CGRectMake(self.size.width/4*2, 0, self.size.width/4, self.size.height);
break;
case XYCropImageStyleRightQuarter:
rect = CGRectMake(self.size.width/4*3, 0, self.size.width/4, self.size.height);
break;
default:
break;
}
CGImageRef imageRef = self.CGImage;
CGImageRef imagePartRef = CGImageCreateWithImageInRect(imageRef, rect);
UIImage *cropImage = [UIImage imageWithCGImage:imagePartRef];
CGImageRelease(imagePartRef);
return cropImage;
}
實際運用:
簡單測試一下,看看有沒有實現我們想要的效果。首先,先加載一個完整的UIImageView。這個應該不難。代碼如下:
UIImageView *imgView = [[UIImageView alloc] init]; imgView.frame = CGRectMake((SCREEN.width - 226) / 2, 100, 226, 106); UIImage *image = [UIImage imageNamed:@"ganggang"]; imgView.image = image; [self.view addSubview:imgView];
運行一下:

要對UIImage進行裁剪,首先導入頭文件:
#import "UIImage+Crop.h"
在上面UIImage *image = [UIImage imageNamed:@"ganggang"];這段代碼之後加上下面這句:
image = [image imageByCroppingWithStyle:XYCropImageStyleLeft];
XYCropImageStyleLeft是截取照片的左半部分。效果如下:

截取成功,還可以截取其他區域的,只需要傳入不同的XYCropImageStyle即可實現。
UIImage等比縮放
前面講了截取UIImage指定大小區域,很方便的截取UIImage。今天要和大家分享的是UIImage的縮放。
兩種縮放:
1.縮放到指定大小
- (UIImage*)imageCompressWithSimple:(UIImage*)image scaledToSize:(CGSize)size
{
UIGraphicsBeginImageContext(size);
[image drawInRect:CGRectMake(0,0,size.width,size.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
2.等比縮放
(1)通過縮放系數:
- (UIImage*)imageCompressWithSimple:(UIImage*)image scale:(float)scale
{
CGSize size = image.size;
CGFloat width = size.width;
CGFloat height = size.height;
CGFloat scaledWidth = width * scale;
CGFloat scaledHeight = height * scale;
UIGraphicsBeginImageContext(size); // this will crop
[image drawInRect:CGRectMake(0,0,scaledWidth,scaledHeight)];
UIImage* newImage= UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
scale是縮放系數 。
(2)通過計算得到縮放系數
- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
UIImage *sourceImage = [UIImage imageNamed:@"test.jpg"];
UIImage *newImage = nil;
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint = CGPointMake(0.0,0.0);
if (CGSizeEqualToSize(imageSize, targetSize) == NO)
{
CGFloat widthFactor = targetWidth / width;
CGFloat heightFactor = targetHeight / height;
if (widthFactor > heightFactor)
scaleFactor = widthFactor; // scale to fit height
else
scaleFactor = heightFactor; // scale to fit width
scaledWidth= width * scaleFactor;
scaledHeight = height * scaleFactor;
// center the image
if (widthFactor > heightFactor)
{
thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
}
else if (widthFactor < heightFactor)
{
thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
}
}
UIGraphicsBeginImageContext(targetSize); // this will crop
CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width= scaledWidth;
thumbnailRect.size.height = scaledHeight;
[sourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
if(newImage == nil)
NSLog(@"could not scale image");
//pop the context to get back to the default
UIGraphicsEndImageContext();
return newImage;
}