zoukankan      html  css  js  c++  java
  • UIImage 裁剪图片和等比列缩放图片

    本文转载至 http://blog.csdn.net/cuiweijie3/article/details/9514293 

    转自 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>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:[NSURLURLWithString:@"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;
    }
  • 相关阅读:
    雅礼集训2017day5乱写
    任意值域最长公共子序列问题
    雅礼集训2017day4乱写
    雅礼集训2017day2乱写
    SP839
    雅礼集训2017day1乱写
    CF671E
    仅维护当前区间影响类问题的线段树
    「雅礼集训 2017 Day4」编码
    Codeforces Round #503 Div. 2
  • 原文地址:https://www.cnblogs.com/Camier-myNiuer/p/4445400.html
Copyright © 2011-2022 走看看