iOS – CoreImage – 为部分图像添加效果

我只是看看iOS 5上的CoreImage框架,发现很容易为整个图像添加效果。 我想知道是否可以在图像的特殊部分(矩形)上添加效果。 例如在部分图像上添加灰度效果/

我期待着你的帮助。

谢谢,谢

观看WWDC 2012video中的会话510。 他们提出了一种如何将掩模应用于CIImage 。 您需要了解如何将filter链接在一起。 特别要看一下:

  • CICropCILinearGradientCIRadialGradient (可用于创建掩码)
  • CISourceOverCompositing (将掩码图像放在一起)
  • CIBlendWithMask (创建最终图像)

示例:像素化面孔

filter在此处记录:

https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

你最好的选择是复制CIImage(所以你现在有两个),将复制的CIImage裁剪到想要效果的矩形,对裁剪版本执行效果,然后使用叠加效果创建一个新的CIImage,基于两个较旧的CIImages。

这看起来很费劲,但是当你明白所有这些都被设置为一堆GPU着色器时,它会更有意义。

  typedef enum { ALPHA = 0, BLUE = 1, GREEN = 2, RED = 3 

} 像素;

 - (UIImage *)convertToGrayscale:(UIImage *) originalImage inRect: (CGRect) rect{ CGSize size = [originalImage size]; int width = size.width; int height = size.height; // the pixels will be painted to this array uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t)); // clear the pixels so any transparency is preserved memset(pixels, 0, width * height * sizeof(uint32_t)); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // create a context with RGBA pixels CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); // paint the bitmap to our context which will fill in the pixels array CGContextDrawImage(context, CGRectMake(0, 0, width, height), [originalImage CGImage]); for(int y = 0; y < height; y++) { for(int x = 0; x < width; x++) { uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x]; if(x > rect.origin.x && y > rect.origin.y && x < rect.origin.x + rect.size.width && y < rect.origin.y + rect.size.height) { // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE]; // set the pixels to gray in your rect rgbaPixel[RED] = gray; rgbaPixel[GREEN] = gray; rgbaPixel[BLUE] = gray; } } } // create a new CGImageRef from our context with the modified pixels CGImageRef image = CGBitmapContextCreateImage(context); // we're done with the context, color space, and pixels CGContextRelease(context); CGColorSpaceRelease(colorSpace); free(pixels); // make a new UIImage to return UIImage *resultUIImage = [UIImage imageWithCGImage:image]; // we're done with image now too CGImageRelease(image); return resultUIImage; 

}

您可以在UIImageView中测试它:

  imageview.image = [self convertToGrayscale:imageview.image inRect:CGRectMake(50, 50, 100, 100)];