1

Я строю своеобразное цензурное приложение. Я до сих пор понял, что могу добавить пиксель изображения, снятого с моим iPhone.рисунок изображения из CALayers

Но я хочу достичь в конце изображения, как это: http://images-mediawiki-sites.thefullwiki.org/11/4/8/8/8328511755287292.jpg

Так что моя мысль была полностью Пикселизация моего изображения, а затем добавьте маску поверх него, чтобы достичь желаемого эффекта. Таким образом, с точки зрения слоев это выглядит так: originalImage + maskedPixelatedVersionOfImage .. Я подумывал о анимации маски при касании изображения, масштабирования маски до нужного размера. Чем дольше вы держите палец на изображении, тем больше становится маска ...

После некоторого поиска, я думаю, это можно сделать с помощью CALayers и CAAnimation. Но как мне затем объединить эти слои с изображением, которое я могу сохранить в фотоальбоме на iphone?

Я правильно подхожу сюда?

EDIT:

Хорошо, я предполагаю, что решение Оле является правильным, хотя я до сих пор не получить то, что я хочу: код, который я использую:

CALayer *maskLayer = [CALayer layer]; 
    CALayer *mosaicLayer = [CALayer layer]; 

    // Mask image ends with 0.15 opacity on both sides. Set the background color of the layer 
    // to the same value so the layer can extend the mask image. 
    mosaicLayer.contents = (id)[img CGImage]; 
    mosaicLayer.frame = CGRectMake(0,0, img.size.width, img.size.height); 
    UIImage *maskImg = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mask" ofType:@"png"]]; 
    maskLayer.contents = (id)[maskImg CGImage]; 
    maskLayer.frame = CGRectMake(100,150, maskImg.size.width, maskImg.size.height); 

    mosaicLayer.mask = maskLayer; 

    [imageView.layer addSublayer:mosaicLayer]; 

    UIGraphicsBeginImageContext(imageView.layer.bounds.size); 
    [imageView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *saver = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

Так что в моем ImageView я сделал: setImage, у которого есть оригинальная (неотредактированная) версия фотографии. Кроме того, я добавляю подуровень, mosaicLayer, который имеет свойство mask: maskLayer. Я подумал, создав корнеукладчик imageView, все получится нормально. Это неправильно?

Кроме того, я понял что-то еще: моя маска растянута и повернута, что, я думаю, имеет какое-то отношение к imageOrientation? Я заметил, что случайно сохранил mosaicLayer в своей библиотеке, что также объясняет проблему, с которой у меня была маска, которая маскировала неправильную часть моего изображения ...

ответ

7

Чтобы сделать дерево слоев, поместите все слои в общий слой контейнера и называют:

UIGraphicsBeginImageContext(containerLayer.bounds.size); 
[containerLayer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

ОК спасибо, я попробую это. Как вы думаете, у меня есть правильный подход к остальным? – ThomasM

+1

Возможно, стоит отметить, что этот подход помешает вам сделать рендеринг на фоновом потоке. Если вам нужна безопасность потоков, избегайте 'UI' -функций и создайте свой собственный' CGBitmapContext': http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGBitmapContext/Reference/reference.html –

+0

Это также может не удастся захватить изображение с AVCaptureVideoPreviewLayer, если он использовал это для представления кадров в реальном времени. –

4

Если вы готовы отказаться от поддержки до iPhone 3G S устройств (iPhone и iPhone 3G), я предлагаю использовать OpenGL ES 2.0 шейдеров для этого. Хотя может быть легко наложить CALayer, содержащий пикселированную версию изображения, я думаю, вы обнаружите, что производительность не хватает.

В my tests, выполняющий простой расчет на основе ЦП на каждом пикселе изображения 480 х 320, привело к частоте кадров около 4 кадров в секунду на iPhone 4. Возможно, вы сможете пробовать только часть этих пикселей для достижения желаемый эффект, но по-прежнему будет медленной операцией, чтобы перерисовать пикселированное изображение в соответствии с живым видео.

Вместо этого, если вы используете шейдер фрагмента OpenGL ES 2.0 для обработки входящего видеоизображения в реальном времени, вы можете взять необработанное изображение камеры, применить этот фильтр выборочно по желаемой области и либо отобразить, либо сохранить получившееся изображение камеры. Эта обработка будет происходить почти полностью на графическом процессоре, который, как я нашел, выполняет такие простые операции, как это при 60 FPS на iPhone 4.

При получении фрагментарного шейдера для работы совершенно правильно может потребоваться небольшая настройка, вы возможно, сможет использовать this sample application Я написал для обработки ввода камеры и отслеживания цвета, чтобы стать достойной отправной точкой. Вы также можете посмотреть на жестом касания, который я использую там, где я беру начальную точку касания, чтобы быть местом, чтобы центрировать эффект вокруг, а затем последующее расстояние перетаскивания, чтобы контролировать силу или радиус эффекта.

+0

интересно, я обязательно посмотрю на ваш код, особенно на жесты касания. Но я пытаюсь снимать фотографии, нет живого видео. Производительности, которую я получаю сейчас, достаточно. Я подумал о openGL, но подумал, что это всего лишь одна фотография. :) спасибо в любом случае – ThomasM

+0

@ThomasM - Вам все равно придется иметь предварительный просмотр в реальном времени, даже если вы только заботитесь о изображениях. Это может обеспечить такой предварительный просмотр с обратной связью в реальном времени, одновременно делая его очень быстрым для обработки полноразмерного изображения для сохранения, когда пользователь составил свой снимок. –

+0

Нет, действительно, дело в том, чтобы сделать снимок, и ТОГДА его цензура. Поэтому мне действительно не нужно жить. Я посмотрел на ваш проект, и в то время мне кажется слишком сложным. Я на самом деле разработчик AS3, и я делаю первые шаги в iOS dev. Я нахожу реальную боль, даже для того, чтобы просто ее прочитать :) Тем не менее, я думаю, что могу использовать ваш проект или его части для дальнейшего обучения и в качестве ресурса для некоторого кода. Видеть, как дела обстоят лучше всего, лучше всего учиться? – ThomasM

Смежные вопросы