zoukankan      html  css  js  c++  java
  • iOS开发中常用的分类方法---UIImage+Category

    在开发中使用分类对原有的系统类进行方法扩展,是增强系统原有类功能的常见做法。

    /**
     *  自由拉伸一张图片
     *
     *  @param name 图片名字
     *  @param left 左边开始位置比例  值范围0-1
     *  @param top  上边开始位置比例  值范围0-1
     *
     *  @return 拉伸后的Image
     */
     + (UIImage *)resizedImageWithName:(NSString *)name left:(CGFloat)left top:(CGFloat)top
    {
        UIImage *image = [UIImage imageNamed:name];
        return [image stretchableImageWithLeftCapWidth:image.size.width * left topCapHeight:image.size.height * top];
    }
    
    /**
     *  根据颜色和大小获取Image
     *
     *  @param color 颜色
     *  @param size  大小
     *
     */
    + (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size
    {
        UIGraphicsBeginImageContextWithOptions(size, 0, [UIScreen mainScreen].scale);
        [color set];
        UIRectFill(CGRectMake(0, 0, size.width, size.height));
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
    /**
     *  根据图片和颜色返回一张加深颜色以后的图片
     */
    + (UIImage *)colorizeImage:(UIImage *)baseImage withColor:(UIColor *)theColor {
        
        UIGraphicsBeginImageContext(CGSizeMake(baseImage.size.width*2, baseImage.size.height*2));
        
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGRect area = CGRectMake(0, 0, baseImage.size.width * 2, baseImage.size.height * 2);
        
        CGContextScaleCTM(ctx, 1, -1);
        CGContextTranslateCTM(ctx, 0, -area.size.height);
        
        CGContextSaveGState(ctx);
        CGContextClipToMask(ctx, area, baseImage.CGImage);
        
        [theColor set];
        CGContextFillRect(ctx, area);
        
        CGContextRestoreGState(ctx);
        
        CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
        
        CGContextDrawImage(ctx, area, baseImage.CGImage);
        
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        
        UIGraphicsEndImageContext();
        
        return newImage;
    }
    /**
     *  根据图片返回一张高斯模糊的图片
     *
     *  @param blur 模糊系数
     *
     *  @return 新的图片
     */
    - (UIImage *)boxblurImageWithBlur:(CGFloat)blur {
        
        NSData *imageData = UIImageJPEGRepresentation(self, 1); // convert to jpeg
        UIImage* destImage = [UIImage imageWithData:imageData];
        
        
        if (blur < 0.f || blur > 1.f) {
            blur = 0.5f;
        }
        int boxSize = (int)(blur * 40);
        boxSize = boxSize - (boxSize % 2) + 1;
        
        CGImageRef img = destImage.CGImage;
        
        vImage_Buffer inBuffer, outBuffer;
        
        vImage_Error error;
        
        void *pixelBuffer;
        
        
        //create vImage_Buffer with data from CGImageRef
        
        CGDataProviderRef inProvider = CGImageGetDataProvider(img);
        CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
        
        
        inBuffer.width = CGImageGetWidth(img);
        inBuffer.height = CGImageGetHeight(img);
        inBuffer.rowBytes = CGImageGetBytesPerRow(img);
        
        inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
        
        //create vImage_Buffer for output
        
        pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
        
        if(pixelBuffer == NULL)
            NSLog(@"No pixelbuffer");
        
        outBuffer.data = pixelBuffer;
        outBuffer.width = CGImageGetWidth(img);
        outBuffer.height = CGImageGetHeight(img);
        outBuffer.rowBytes = CGImageGetBytesPerRow(img);
        
        // Create a third buffer for intermediate processing
        void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
        vImage_Buffer outBuffer2;
        outBuffer2.data = pixelBuffer2;
        outBuffer2.width = CGImageGetWidth(img);
        outBuffer2.height = CGImageGetHeight(img);
        outBuffer2.rowBytes = CGImageGetBytesPerRow(img);
        
        //perform convolution
        error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
        if (error) {
            NSLog(@"error from convolution %ld", error);
        }
        error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
        if (error) {
            NSLog(@"error from convolution %ld", error);
        }
        error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
        if (error) {
            NSLog(@"error from convolution %ld", error);
        }
        
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        CGContextRef ctx = CGBitmapContextCreate(outBuffer.data,
                                                 outBuffer.width,
                                                 outBuffer.height,
                                                 8,
                                                 outBuffer.rowBytes,
                                                 colorSpace,
                                                 (CGBitmapInfo)kCGImageAlphaNoneSkipLast);
        CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
        UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
        
        //clean up
        CGContextRelease(ctx);
        CGColorSpaceRelease(colorSpace);
        
        free(pixelBuffer);
        free(pixelBuffer2);
        CFRelease(inBitmapData);
        
        CGImageRelease(imageRef);
        
        return returnImage;
    }
    /**
     *  自由改变Image的大小
     *
     *  @param size 目的大小
     *
     *  @return 修改后的Image
     */
    - (UIImage *)cropImageWithSize:(CGSize)size {
        
        float scale = self.size.width/self.size.height;
        CGRect rect = CGRectMake(0, 0, 0, 0);
        
        if (scale > size.width/size.height) {
            
            rect.origin.x = (self.size.width - self.size.height * size.width/size.height)/2;
            rect.size.width  = self.size.height * size.width/size.height;
            rect.size.height = self.size.height;
            
        }else {
            
            rect.origin.y = (self.size.height - self.size.width/size.width * size.height)/2;
            rect.size.width  = self.size.width;
            rect.size.height = self.size.width/size.width * size.height;
            
        }
        
        CGImageRef imageRef   = CGImageCreateWithImageInRect(self.CGImage, rect);
        UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
        CGImageRelease(imageRef);
        
        return croppedImage;
    }
    
    
    
    
    
  • 相关阅读:
    FPGA市场潜力有几多?
    FPGA前世今生(四)
    FPGA前世今生(三)
    FPGA前世今生(二)
    FPGA前世今生(一)
    嵌入式视频处理考虑(二)
    常用Linux操作命令
    混合开发学习路线
    Eclipse使用
    ECS的配置与使用
  • 原文地址:https://www.cnblogs.com/iyou/p/4918989.html
Copyright © 2011-2022 走看看