`

UIImage的扩展方法——裁剪图片和等比列缩放图片

阅读更多
首先创建一个UIImage类别,如下:

@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>1 && horizontalRadio>1) 
    { 
        radio = verticalRadio > horizontalRadio ? horizontalRadio : verticalRadio;    
    } 
    else 
    { 
        radio = verticalRadio < 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:@"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(@"image.size:%@",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:@"objectiveDrawRegion1.png"];

//创建图片缓冲
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 图片裁剪 自定义大小 图片可缩放

    综上所述,自定义裁剪和图片缩放功能涉及多个iOS开发的关键知识点,包括UIKit组件的使用、手势识别、图形上下文操作等。实现这样的功能不仅提高了应用的用户体验,也为用户提供更多个性化编辑的可能。在实际开发中,...

    UIImage扩展

    10. 方法实现:在实现部分,添加了对称的实现方法roundToSize:corner:和scaleToSize:,这些方法都是UIImage扩展的一部分,用于具体实现图片的圆角和缩放功能。 由于原始文档部分文字是通过OCR扫描生成的,因此在...

    OC Extension UIImage+FHXImage(图片扩展).zip

    OC Extension UIImage+FHXImage(图片扩展) 针对UIImage进行封装的工具类。 /** 输入图片颜色返回一张图片 */ + (UIImage *)createImageWithColor:(UIColor *)color; /** 裁切图片的一个点进行延伸 */ - ...

    swift-SwiftGif-带有gif支持的小型UIImage扩展

    SwiftGif通过扩展UIImage类,添加了加载和播放GIF的能力,使得开发者能够无缝地处理这种流行的动画格式。其主要功能包括: 1. **GIF加载**:SwiftGif能够解析GIF文件,并将其转化为一系列连续的UIImage对象,这使得...

    IOS应用源码——UIImage+Sprite for iOS.rar

    这个"UIImage+Sprite for iOS"的源码库显然扩展了UIImage类,增加了精灵(Sprite)功能,这通常用于2D游戏或者需要高效处理多帧动画的场景。在iOS应用中,精灵是一种常用的图形管理技术,它将多个小图像组合成一个大...

    ios开发UIImage category实现添加水印(图片和文字)

    UIImage Category是一种优雅的方式,可以扩展UIImage的功能,无需修改原生类,方便地实现水印功能。本教程将深入讲解如何通过Category实现UIImage的水印功能。 首先,让我们了解Category的概念。Category是...

    IOS应用源码——调整图片大小长宽的组件.zip

    UIImage类是iOS中处理图片的主要接口,它提供了缩放图片的方法。例如,`-[UIImage imageWithCGImage:scale:orientation:]`可以根据给定的CGImage、缩放比例和方向创建新的UIImage实例。 5. 并行处理与GCD(Grand ...

    iOS应用开发中对UIImage进行截取和缩放的方法详解

    缩放分为两种常见的类型:指定大小缩放和等比缩放。指定大小缩放是指将图片强制调整到特定尺寸,可能会改变图片的原始比例。等比缩放则保持图片的比例,防止拉伸或压缩。 对于指定大小缩放,我们可以使用以下代码:...

    UIImage-PDF.zip

    接着,使用`CGPDFPageGetDrawingTransform`获取页面的变换矩阵,以便正确地缩放和裁剪页面到`UIImage`的大小。最后,使用`UIGraphicsBeginImageContext`创建一个新的图形上下文,将PDF页面绘制到这个上下文中,然后...

    UIImage 图片处理:截图,缩放,设定大小,存储_蓝科教育

    UI 图片处理是 iOS 开发中一个非常重要的topic,UIImage 是 iOS 中表示图像的类,它提供了多种方法来处理图像,在这里我们将介绍 UIImage 图片处理的四种方法:截图、缩放、设定大小和存储。 截图 截图是将 UIView...

    iOS裁剪图片,抠图,比例裁剪

    在iOS开发中,图片的裁剪、抠图和比例裁剪是常见的图像处理需求,尤其在用户需要上传头像或自定义图片时。本篇将详细介绍如何使用Objective-C(OC)语言来实现这些功能。 首先,我们要理解iOS中处理图片的基础类`...

    OGImageExtensions:UIImage 扩展和工具

    "OGImageExtensions"的文档详细介绍了每个扩展方法的用途和用法,帮助开发者快速理解和应用。这些方法覆盖了图像的加载、处理、转换等多个方面,比如: 1. **异步加载图片**:这个扩展可能包含从网络、文件系统或者...

    swift-iOS实现动态区域裁剪图片

    5. 裁剪图片:在用户完成裁剪后,使用`CGContext`和计算好的坐标变换裁剪图片,得到新的`CGImage`,再转换成`UIImage`。 在代码实现时,可以创建一个专门的`CropViewController`,将裁剪逻辑封装在这个控制器中。...

    IOS应用源码——图片展示.rar

    5. **图片缩放与裁剪**: 如果图片尺寸过大,需要进行适当的缩放以节省内存和提高显示速度。UIImage提供了`resize`和`scaleToSize:`方法,可以调整图片大小。对于特定显示区域,可能还需要裁剪图片。 6. **动画展示*...

    UIIMage 改变颜色和遮罩

    当你需要对图片进行颜色调整或添加遮罩效果时,可以利用UIKit框架中的各种方法和属性来实现。下面将详细介绍如何改变UIImage的颜色以及如何应用遮罩。 1. 改变UIImage颜色: - 使用`UIImageRenderingMode....

    UIImage+Sprite+Animmation

    这个类扩展了`UIImage`,增加了精灵(Sprite)和动画功能,让开发者能够更灵活地创建和控制游戏或应用中的动态图像。`UIImage+Sprite+Additions`可能是这个库或框架的名称,它提供了一些类别方法来增强原生`UIImage`...

    ios UIImage category 图片加载

    标题提到的"ios UIImage category 图片加载"是关于如何通过分类扩展`UIImage`类,以提供更高效的图片加载策略。描述中特别提到了避免使用`imageNamed:`方法,因为这种方法在某些情况下可能会导致内存压力增大。 ...

    IOS应用源码——facebook图片拾取器.zip

    4. **UIImage和UIImageView**:在iOS中,UIImage用于存储和显示图片,而UIImageView则用于在屏幕上展示UIImage对象。开发者需要使用这些类来加载和显示Facebook照片。 5. **UIPagination**:为了实现图片浏览器功能...

    iOS游戏应用源代码——r3econ-UIImage-Sprite-Additions-0738b37.zip

    UIImage是苹果iOS SDK中的一个基础类,用于处理和显示图片资源。在这个项目中,开发者为UIImage添加了额外的功能,使其能更好地适应游戏开发的需求。 UIImage通常用于加载和显示静态图像,但在游戏中,为了实现动态...

    手动截图裁剪图片

    在IT领域,手动截图和裁剪图片是常见的图像处理操作,尤其在移动设备和桌面应用中广泛使用。本文将深入探讨这一主题,介绍如何实现这一功能,并涉及相关的技术点。 首先,手动截图功能通常涉及到操作系统级别的API...

Global site tag (gtag.js) - Google Analytics