iOS - CoreImage - Agrega un efecto a una parte de la imagen

Acabo de echar un vistazo al marco CoreImage en iOS 5 y descubrí que es fácil agregar un efecto a toda la imagen. Me pregunto si es posible agregar un efecto en una parte especial de la imagen (un rectángulo). por ejemplo, agregue un efecto de escala de grises en parte de la imagen /

Espero tu ayuda.

Gracias, huy

preguntado el 04 de julio de 12 a las 04:07

No publique la misma pregunta varias veces. -

no creo que sean iguales esta pregunta es sobre el marco CoreImage -

3 Respuestas

Mira la sesión 510 de los videos de la WWDC 2012. Presentan una técnica de cómo aplicar una máscara a un CIImage. Necesitas aprender a encadenar los filtros juntos. En particular, eche un vistazo a:

  • CICrop, CILinearGradient, CIRadialGradient (podría usarse para crear la máscara)
  • CISourceOverCompositing (poner imágenes de máscara juntas)
  • CIBlendWithMask (crear imagen final)

Ejemplo: caras pixeladas

Los filtros están documentados aquí:

https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html

Respondido 16 Abr '19, 13:04

Lo mejor que puede hacer es copiar la CIImage (por lo que ahora tiene dos), recortar la CIImage copiada al rect que desea aplicar, realizar el efecto en esa versión recortada y luego usar un efecto de superposición para crear una nueva CIImage basada en la dos imágenes CI más antiguas.

Parece mucho esfuerzo, pero cuando entiendes que todo esto se está configurando como un montón de sombreadores de GPU, tiene mucho más sentido.

Respondido 29 Jul 12, 12:07

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

} PÍXELES;

- (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;

}

Puedes probarlo en un UIImageView:

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

Respondido 04 Jul 12, 05:07

Esto no responde a la pregunta de cómo aplicar un filtro a una parte de la imagen. ¡El código no usa CoreImage (procesamiento de imágenes GPU) pero procesa imágenes en la CPU! - Felix

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.