美文网首页
iOS之图片滤镜

iOS之图片滤镜

作者: BoomLee | 来源:发表于2017-06-16 15:41 被阅读432次

    利用CoreGraphics库制作滤镜,效果如下:

    滤镜

    代码

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        UIImage *image = [UIImage imageNamed:@"IMG_1408.JPG"];
        unsigned char *data = [self convertUIImageToData:image];
        data = [self grayImageWithData:data originalImage:image];
        self.imageViewGray.image = [self convertDataToUIImage:data image:image];
        
    }
    
    #pragma mark - 将UIImage转化为像素数据
    - (unsigned char *)convertUIImageToData:(UIImage *)image{
        CGSize size = image.size;
    
        void *data = malloc(size.width * size.height * 4);
        
        CGImageRef imageRef = [image CGImage];
        CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();//RGBA
        CGContextRef contextRef = CGBitmapContextCreate(data, size.width, size.height, 8, 4 * size.width, colorSpaceRef, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
        CGContextDrawImage(contextRef, CGRectMake(0, 0, size.width, size.height), imageRef);
        
        //mrc
        CGColorSpaceRelease(colorSpaceRef);
        CGContextRelease(contextRef);
        
        return (unsigned char *)data;
    }
    
    #pragma mark - 对像素进行灰度处理
    - (unsigned char *)grayImageWithData:(unsigned char *)imageData originalImage:(UIImage *)originalImage{
        CGFloat width = originalImage.size.width;
        CGFloat height = originalImage.size.height;
        unsigned char *resultData = malloc(width * height * sizeof(unsigned char) * 4);
        
        memset(resultData, 0, sizeof(unsigned char) * 4);
        
        for (int h = 0; h < height; h++) {
            for (int w = 0; w < width; w++) {
                unsigned int imageIndex = h*width + w;
                
                unsigned char bitMapRed = *(imageData + imageIndex*4);
                unsigned char bitMapGreen = *(imageData + imageIndex*4 + 1);
                unsigned char bitMapBlue = *(imageData + imageIndex*4 + 2);
    
                int bitMap = bitMapRed * 77 / 255 + bitMapGreen * 151 / 255 + bitMapBlue * 88 / 255;
                unsigned char newBitMap = (bitMap > 255) ? 255 : bitMap;
                memset(resultData + imageIndex*4, newBitMap, 1);
                memset(resultData + imageIndex*4 + 1, newBitMap, 1);
                memset(resultData + imageIndex*4 + 2, newBitMap, 1);
    
            }
        }
        
        return resultData;
    }
    
    #pragma mark - 对像素进行颜色反转处理
    - (unsigned char *)reColorImageWithData:(unsigned char *)imageData originalImage:(UIImage *)originalImage{
        CGFloat width = originalImage.size.width;
        CGFloat height = originalImage.size.height;
        unsigned char *resultData = malloc(width * height * sizeof(unsigned char) * 4);
        
        memset(resultData, 0, sizeof(unsigned char) * 4);
        
        for (int h = 0; h < height; h++) {
            for (int w = 0; w < width; w++) {
                unsigned int imageIndex = h*width + w;
                
                unsigned char bitMapRed = *(imageData + imageIndex*4);
                unsigned char bitMapGreen = *(imageData + imageIndex*4 + 1);
                unsigned char bitMapBlue = *(imageData + imageIndex*4 + 2);
                unsigned char bitMapRedRe = 255 - bitMapRed;
                unsigned char bitMapGreenRe = 255 - bitMapGreen;
                unsigned char bitMapBlueRe = 255 - bitMapBlue;
    
                memset(resultData + imageIndex*4, bitMapRedRe, 1);
                memset(resultData + imageIndex*4 + 1, bitMapGreenRe, 1);
                memset(resultData + imageIndex*4 + 2, bitMapBlueRe, 1);
                
            }
        }
        
        return resultData;
    }
    
    #pragma mark - 将像素数据转化为UIImage
    - (UIImage *)convertDataToUIImage:(unsigned char *)imageData image:(UIImage *)imageSource{
        CGFloat width = imageSource.size.width;
        CGFloat height = imageSource.size.height;
        CGFloat dataLength = width * height * 4;
        
        CGDataProviderRef dataProviderRef = CGDataProviderCreateWithData(NULL, imageData, dataLength, NULL);
        CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
        
        CGImageRef imageRef = CGImageCreate(width, height, 8, 32, 4*width, colorSpaceRef, kCGBitmapByteOrderDefault, dataProviderRef, NULL, NO, kCGRenderingIntentDefault);
        UIImage *image = [UIImage imageWithCGImage:imageRef];
        
        //mrc
        CGImageRelease(imageRef);
        CGDataProviderRelease(dataProviderRef);
        CGColorSpaceRelease(colorSpaceRef);
        
        return image;
    }
    

    上一篇:git笔记
    下一篇:iOS之多线程

    相关文章

      网友评论

          本文标题:iOS之图片滤镜

          本文链接:https://www.haomeiwen.com/subject/jhkmqxtx.html