iO图片处理(如截屏、圆角、改变大小等)

来源:互联网 发布:java 模板编程 编辑:程序博客网 时间:2024/06/07 09:01

// 获取截屏- (UIImage *)GetScreenImage{    UIGraphicsBeginImageContext(self.view.bounds.size);    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return image;}
// 截取屏幕中局部图片 arect想要截图的区域-(void)GetScreenImageWithRect:(CGRect)aRect{    UIGraphicsBeginImageContextWithOptions(CGSizeMake(640, 960), YES, 0);    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    CGImageRef imageRef = viewImage.CGImage;        CGRect rect =aRect; //这里可以设置想要截图的区域    CGImageRef imageRefRect =CGImageCreateWithImageInRect(imageRef, rect);    UIImage *sendImage = [[UIImage alloc] initWithCGImage:imageRefRect];    NSData *imageViewData = UIImagePNGRepresentation(sendImage);       // 第一,保存到沙盒    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *documentsDirectory = [paths objectAtIndex:0];    NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:@"zone.png"];    NSLog(@"%@", savedImagePath);    [imageViewData writeToFile:savedImagePath atomically:YES];    CGImageRelease(imageRefRect);       // 第二,保存到相册    UIImage *image = [UIImage imageWithData:imageViewData];    UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);}
// 将图片裁剪成圆角的,并没有改变图片的质量static void AddRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight){    float fw, fh;    if (ovalWidth == 0 || ovalHeight == 0)    {        CGContextAddRect(context, rect);        return;    }        CGContextSaveGState(context);    CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect));    CGContextScaleCTM(context, ovalWidth, ovalHeight);    fw = CGRectGetWidth(rect) / ovalWidth;    fh = CGRectGetHeight(rect) / ovalHeight;        CGContextMoveToPoint(context, fw, fh/2);  // Start at lower right corner    CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);  // Top right corner    CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); // Top left corner    CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); // Lower left corner    CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); // Back to lower right        CGContextClosePath(context);    CGContextRestoreGState(context);}- (UIImage *)GetRoundedRectImage:(UIImage *)image roundRadius:(CGFloat)radius{    if (!radius)    {        radius = 8;    }    // the size of CGContextRef    int w = image.size.width;    int h = image.size.height;        UIImage *img = image;    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();    CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);    CGRect rect = CGRectMake(0, 0, w, h);        CGContextBeginPath(context);    AddRoundedRectToPath(context, rect, radius, radius);    CGContextClosePath(context);    CGContextClip(context);    CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);    CGImageRef imageMasked = CGBitmapContextCreateImage(context);    CGContextRelease(context);    CGColorSpaceRelease(colorSpace);    return [UIImage imageWithCGImage:imageMasked];}
// 改变图片大小- (UIImage *)ReSizeImage:(UIImage *)image toSize:(CGSize)reSize{    UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));    [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];    UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();        return reSizeImage;    }
// 方形图片- (UIImage *)GetSquareImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize{    double ratio;    double delta;    CGPoint offset;    CGSize sz = CGSizeMake(newSize.width, newSize.width);    if (image.size.width > image.size.height)    {        ratio = newSize.width / image.size.width;        delta = (ratio*image.size.width - ratio*image.size.height);        offset = CGPointMake(delta/2, 0);    }    else    {        ratio = newSize.width / image.size.height;        delta = (ratio*image.size.height - ratio*image.size.width);        offset = CGPointMake(0, delta/2);    }    CGRect clipRect = CGRectMake(-offset.x, -offset.y, (ratio * image.size.width) + delta, (ratio * image.size.height) + delta);    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])    {        UIGraphicsBeginImageContextWithOptions(sz, YES, 0.0);    }    else    {        UIGraphicsBeginImageContext(sz);    }    UIRectClip(clipRect);    [image drawInRect:clipRect];    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();        return newImage;}
// UIImage转为灰度图 CGColorSpaceCreateDeviceGray会创建一个设备相关的灰度颜色空间的引用。- (UIImage *)GetGrayImage:(UIImage *)sourceImage{    int width = sourceImage.size.width;    int height = sourceImage.size.height;    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();    CGContextRef context = CGBitmapContextCreate (nil,width,height,8,0,colorSpace,kCGImageAlphaNone);    CGColorSpaceRelease(colorSpace);    if (context == NULL)    {        return nil;    }    CGContextDrawImage(context,CGRectMake(0, 0, width, height), sourceImage.CGImage);    UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];    CGContextRelease(context);    return grayImage;}
// 图像压缩- (UIImage *)ScaleFromImage:(UIImage *)image scaledToSize:(CGSize)newSize{    CGSize imageSize = image.size;    CGFloat width = imageSize.width;    CGFloat height = imageSize.height;        if (width <= newSize.width && height <= newSize.height)    {        return image;    }        if (width == 0 || height == 0)    {        return image;    }        CGFloat widthFactor = newSize.width / width;    CGFloat heightFactor = newSize.height / height;    CGFloat scaleFactor = (widthFactor<heightFactor?widthFactor:heightFactor);        CGFloat scaledWidth = width * scaleFactor;    CGFloat scaledHeight = height * scaleFactor;    CGSize targetSize = CGSizeMake(scaledWidth,scaledHeight);        UIGraphicsBeginImageContext(targetSize);    [image drawInRect:CGRectMake(0,0,scaledWidth,scaledHeight)];    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return newImage;}
// GIF图片解析将gif图片解析成image数组(注:需使用 #import <ImageIO/ImageIO.h>)+ (NSMutableArray *)praseGIFDataToImageArray:(NSData *)data;{    NSMutableArray *frames = [[NSMutableArray alloc] init];    CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)data, NULL);    CGFloat animationTime = 0.f;    if (src)    {        size_t l = CGImageSourceGetCount(src);        frames = [NSMutableArray arrayWithCapacity:l];        for (size_t i = 0; i < l; i++)        {            CGImageRef img = CGImageSourceCreateImageAtIndex(src, i, NULL);            NSDictionary *properties = (NSDictionary *)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(src, i, NULL));            NSDictionary *frameProperties = [properties objectForKey:(NSString *)kCGImagePropertyGIFDictionary];            NSNumber *delayTime = [frameProperties objectForKey:(NSString *)kCGImagePropertyGIFUnclampedDelayTime];            animationTime += [delayTime floatValue];            if (img)            {                [frames addObject:[UIImage imageWithCGImage:img]];                CGImageRelease(img);            }        }        CFRelease(src);    }    return frames;}
// 圆角处理(lay层处理)- (void)resetImage:(UIImageView *)imageview corner:(CGFloat)corner rasterize:(BOOL)rasterize{    if (imageview)    {        imageview.clipsToBounds = YES;        imageview.layer.masksToBounds = YES;        imageview.layer.cornerRadius = corner;                // UIImageView不加这句会产生一点模糊        imageview.layer.rasterizationScale = [UIScreen mainScreen].scale;                // 设置光栅化,可以使离屏渲染的结果缓存到内存中存为位图。使用的时候直接使用缓存,节省了一直离屏渲染损耗的性能        imageview.layer.shouldRasterize = rasterize;    }}
// 圆角处理(drawRect处理)- (void)resetImage:(UIImageView *)imageview corner:(CGFloat)corner image:(UIImage *)image{    if (imageview && image)    {        UIGraphicsBeginImageContextWithOptions(imageview.bounds.size, NO, [UIScreen mainScreen].scale);        [[UIBezierPath bezierPathWithRoundedRect:imageview.bounds                                    cornerRadius:corner] addClip];        [image drawInRect:imageview.bounds];        imageview.image = UIGraphicsGetImageFromCurrentImageContext();        UIGraphicsEndImageContext();    }}


























0 0
原创粉丝点击