UIImage 裁剪图片和等比列缩放图片

转自 http://www.tedz.me/ios/uiimage-crop-resize-image

@ interface UIImage ( UIImageScale )
- ( UIImage* ) getSubImage : ( CGRect ) rect ;
- ( UIImage* ) scaleToSize : ( CGSize ) size ;
@ end
 
@ 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 ;
}
 
//等比例缩放
- ( UIImage* ) scaleToSize : ( CGSize ) size
{
     CGFloat width = CGImageGetWidth ( self . CGImage ) ;
     CGFloat height = CGImageGetHeight ( self . CGImage ) ;
 
     float verticalRadio = size . height* 1.0 / height ;
     float horizontalRadio = size . width* 1.0 / width ;
 
     float radio = 1 ;
     if ( verticalRadio & gt ; 1 & amp ; & amp ; horizontalRadio & gt ; 1 )
     {
         radio = verticalRadio & gt ; horizontalRadio ? horizontalRadio : verticalRadio ;
     }
     else
     {
         radio = verticalRadio & lt ; horizontalRadio ? verticalRadio : horizontalRadio ;
     }
 
     width = width* radio ;
     height = height* radio ;
 
     int xPos = ( size . width - width ) / 2 ;
     int yPos = ( size . height - height ) / 2 ;
 
     // 创建一个bitmap的context
     // 并把它设置成为当前正在使用的context
     UIGraphicsBeginImageContext ( size ) ;   
 
     // 绘制改变大小的图片
     [ self drawInRect : CGRectMake ( xPos , yPos , width , height ) ] ;   
 
     // 从当前context中创建一个改变大小后的图片
     UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext ( ) ;   
 
     // 使当前的context出堆栈
     UIGraphicsEndImageContext ( ) ;   
 
     // 返回新的改变大小后的图片
     return scaledImage ;
}
@ end
 
然后在下面方法里面调用就可以了!
 
- ( BOOL ) application : ( UIApplication * ) application didFinishLaunchingWithOptions : ( NSDictionary * ) launchOptions
{
     // Override point for customization after application launch.
     UIImage * image = [ [ UIImage alloc ] initWithData : [ NSData dataWithContentsOfURL : [ NSURL URLWithString : @ & quot ; http : //img21.mtime.cn/mg/2011/09/24/112524.53149978.jpg"]] ];
 
     // 裁剪图片
     //image = [image getSubImage:CGRectMake(10, 10, 70, 80)];
 
     //等比列缩放
 
     image = [ image scaleToSize : CGSizeMake ( 200 , 300 ) ] ;
 
     UIImageView * imageView = [ [ UIImageView alloc ] initWithImage : image ] ;
 
     [ self . window addSubview : imageView ] ;
 
     NSLog ( @ & quot ; image . size : % @ & quot ; , NSStringFromCGSize ( CGSizeMake ( imageView . image . size . width , imageView . image . size . height ) ) ) ;    //打印获取的网络图片的宽度和高度
 
     [ self . window makeKeyAndVisible ] ;
     return YES ;
}
 
//--------------截取部分图片到指定位置-------------------------
 
图片 ( UIImage* ) img
要截取的起始坐标 sx : ( int ) sx1 sy : ( int ) sy1
要截取的长度和宽度 sw : ( int ) sw1 sh : ( int ) sh1
最终要显示的坐标 desx : ( int ) desx1 desy : ( int ) desy1
 
- ( UIImage* ) objectiveDrawRegion : ( UIImage* ) img sx : ( int ) sx1 sy : ( int ) sy1 sw : ( int ) sw1 sh : ( int ) sh1 desx : ( int ) desx1 desy : ( int ) desy1 {
[ self saveImage : img name : @ & quot ; objectiveDrawRegion1 . png & quot ; ] ;
 
//创建图片缓冲
void * imageDataRegion = malloc ( screenWidth* screenHeight* 32 ) ;
CGColorSpaceRef iColorSpaceRegion = CGColorSpaceCreateDeviceRGB ( ) ;
     CGContextRefiDeviceRegion = CGBitmapContextCreate ( imageDataRegion , screenWidth , screenHeight , 8 , 4 * screenWidth , iColorSpaceRegion , kCGImageAlphaPremultipliedLast ) ;
 
//剪切区域
     CGRect clipRegion = CGRectMake ( sx1 , sy1 , sw1 , sh1 ) ;
     CGContextClipToRect ( iDeviceRegion , clipRegion ) ;
 
     CGFloat widthf = img . size . width ;
     CGFloat heightf = img . size . height ;
 
CGRect   cg = CGRectMake ( 0.0 , 0.0 , widthf , heightf ) ;
//画底图
     CGContextDrawImage ( iDeviceRegion , cg , img . CGImage ) ;
 
//将缓冲形成图片
     CGImageRef ioffRegion = CGBitmapContextCreateImage ( iDeviceRegion ) ;
 
CGRect   cg1 = CGRectMake ( desx1 , desy1 , sw1 , sh1 ) ;
UIImage * ui = [ UIImage imageWithCGImage : ioffRegion ] ;
 
CGContextDrawImage (当前 context , cg1 , ui . CGImage ) ;
 
//清除缓冲
   CGColorSpaceRelease ( iColorSpaceRegion ) ;
   CGContextRelease ( iDeviceRegion ) ;
   CGImageRelease ( ioffRegion ) ;
   free ( imageDataRegion ) ;
//    iDeviceRegion=NULL;
//    imageDataRegion=0;
 
return ui ;
}

你可能感兴趣的:(ios)