iOS之圖片濾鏡

利用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之多線程

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容