3

Я просто посмотрел на фреймворк CoreImage на iOS 5, обнаружил, что легко добавить эффект для всего изображения. Интересно, возможно ли добавить эффект на специальную часть изображения (прямоугольник). например, добавить эффект серой шкалы на частичном изображении/iOS - CoreImage - Добавить эффект к частичным изображениям

С нетерпением жду вашей помощи.

Спасибо, Юи

+0

Пожалуйста, не оставляйте тот же вопрос несколько раз. –

+0

Я не думаю, что они такие же. этот вопрос касается рамки CoreImage –

ответ

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

} PIXELS;

- (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)]; 
+1

Это не отвечает на вопрос, как применить фильтр к части изображения. Код не использует CoreImage (обработка изображений графического процессора), но выполняет обработку изображений на процессоре! – Felix

0

Лучше бы, чтобы скопировать CIImage (так теперь у вас есть два), обрезать скопированный CIImage к вы хотите произвести эффект, выполнить эффект на эту обрезанную версию, а затем использовать эффект наложения для создания нового CIImage на основе двух предыдущих CIImages.

Это похоже на много усилий, но когда вы понимаете, что все это настроено как куча графических шейдеров, это имеет гораздо больший смысл.

3

Смотреть сеанс 510 из видео WWDC 2012. Они представляют собой способ нанесения маски на CIImage. Вам нужно научиться связывать фильтры вместе. В частности, обратите внимание на:

  • CICrop, CILinearGradient, CIRadialGradient (может быть использован для создания маски)
  • CISourceOverCompositing (поместить маску изображения вместе)
  • CIBlendWithMask (создать окончательное изображение)

Example: Pixelate faces

Фильтры задокументированы здесь:

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