2013-08-16 3 views
0

Я пытаюсь сцепление смешанного слоя и фильтровать ееКак достичь этих цепочек фильтров с помощью рамки GPUImage?

(происхождение -> texture1 (непрозрачность 30%)/HARDLIGHT -> texture2/Softlight) => уровня (45, 0,95, 238) + насыщение (-100) + оттенок (+42)

Вот что я пробовал:

Отредактировано: Этот код работает ниже, спасибо за ответ

// Textures 
GPUImagePicture *origin = [[GPUImagePicture alloc] initWithImage:originImage smoothlyScaleOutput:NO]; 
GPUImagePicture *text1 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"filter_landscape_vintage_1.png"] smoothlyScaleOutput:NO]; 
GPUImagePicture *text2 = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"filter_landscape_vintage_2.png"] smoothlyScaleOutput:NO]; 

// Blend filters 
GPUImageHardLightBlendFilter *blendFilter1 = [[GPUImageHardLightBlendFilter alloc] init]; 
GPUImageSoftLightBlendFilter *blendFilter2 = [[GPUImageSoftLightBlendFilter alloc] init]; 

// Color filters 
GPUImageOpacityFilter *filter1 = [[GPUImageOpacityFilter alloc] init]; 
[filter1 setOpacity:0.3]; 
GPUImageLevelsFilter *filter2 = [[GPUImageLevelsFilter alloc] init]; 
[filter2 setMin:45.0/255.0 gamma:0.95 max:238.0/255.0]; // 45, 0.95, 238 
GPUImageSaturationFilter *filter3 = [[GPUImageSaturationFilter alloc] init]; 
[filter3 setSaturation:0.0]; 
GPUImageHueFilter *filter4 = [[GPUImageHueFilter alloc] init]; 
[filter4 setHue:42.0]; 

// Texture1(opacity 30%)/HardLight 
[text1 addTarget:filter1]; // Opacity 
[filter1 addTarget:blendFilter1]; // HardLight Blend 

// Texture2/SoftLight 
[text2 addTarget:blendFilter2]; // SoftLight Blend 

// Chain Origin + Texture1 + Texture2 
[origin addTarget:blendFilter1]; 
[blendFilter1 addTarget:blendFilter2]; 

// Result => level + saturation + hue 
[blendFilter2 addTarget:filter2]; 
[filter2 addTarget:filter3]; 
[filter3 addTarget:filter4]; 

// Processing 
[origin processImage]; 
[text1 processImage]; 
[text2 processImage]; 

UIImage *output = [filter4 imageFromCurrentlyProcessedOutput]; 
+0

просто проверьте образец. В этом они сделали цепочки фильтров. Просто запустите его, вы поймете это. – Rafeek

ответ

3

Я вижу несколько проблем:

1) Там, вероятно, фильтры опечатка СЦЕПЛЕНИЕ TEXT1 в:

[text1 addTarget:filter1]; // Opacity 
[text1 addTarget:blendFilter1]; // HardLight Blend 

вместо этого следует

[text1 addTarget:filter1]; // Opacity 
[filter1 addTarget:blendFilter1]; // HardLight Blend 

2) Вы цепочки фильтров text1 и text2 GPUImagePictures, но забыл обработать их:

// Processing 
[origin processImage]; 
[text1 processImage]; 
[text2 processImage]; 

3) UIImage *output = [blendFilter2 imageFromCurrentlyProcessedOutput];

Вы должны вызвать imageFromCurrentlyProcessedOutput на последний фильтр цепи, которая в вашем случае является group фильтром. Я бы не необходимость используйте GPUImageFilterGroup здесь, который обычно используются для создания фильтров подклассов, которые используют существующие фильтры, но вместо этого я просто бы приковать последние 3 фильтры blendFilter2 так:

... 
// Result => level + saturation + hue 
[blendFilter2 addTarget:filter2]; 
[filter2 addTarget:filter3]; 
[filter3 addTarget:filter4]; 

// Processing 
[origin processImage]; 
[text1 processImage]; 
[text2 processImage]; 

UIImage *output = [filter4 imageFromCurrentlyProcessedOutput]; 

Полная цепочка будет:

[text1] -> [filter1] \ 
         +-> [blend1] \ 
      [origin]/    +-> [blend2] -> [filter2] -> [filter3] -> [filter4] 
          [text2]/

EDIT:

Берегись с теми целыми подразделениями установки мин и макс здесь:

[filter2 setMin:45/255 gamma:0.95 max:238/255]; // 45, 0.95, 238 

мин. И макс. 0!

[filter2 setMin:45/255.0 gamma:0.95 max:238/255.0]; // 45, 0.95, 238 
+0

Я пробовал то, что вы сказали, но результат был действительно неисправен. Считаете ли вы, что эту цепочку можно прослушивать? Я редактировал код выше. – klefevre

+0

Что вы имеете в виду, результат на самом деле глючит? Изменился ли отредактированный код? –

+0

Это больше не крушит, спасибо. В результате на дисплее отображается ошибка. Изображение результата имеет странную форму. Я просто нашел причину, это фильтр Blender SoftLight. Не могу понять, почему это не работает ... Я, кстати, согласился с вашим ответом. – klefevre