2014-05-12 9 views
9

ho bisogno di tagliare da l'immagine completa utilizzando la maschera e ha creato l'immagine mascherata.Come implementare GPUImageMaskFilter utilizzando GPUImage

Full Image+Mask Image=enter image description here

Ho provato quanto segue:

UIImage *imgMask = [UIImage imageNamed:@"Mask.png"]; 
UIImage *imgBgImage = [UIImage imageNamed:@"Full.png"]; 



GPUImageMaskFilter *maskingFilter = [[GPUImageMaskFilter alloc] init]; 


GPUImagePicture * maskGpuImage = [[GPUImagePicture alloc] initWithImage:imgMask ]; 

GPUImagePicture *FullGpuImage = [[GPUImagePicture alloc] initWithImage:imgBgImage ]; 




[maskGpuImage addTarget:maskingFilter]; 
[maskGpuImage processImage]; 


[maskingFilter useNextFrameForImageCapture]; 


[FullGpuImage addTarget:maskingFilter]; 
[FullGpuImage processImage]; 



UIImage *OutputImage = [maskingFilter imageFromCurrentFramebuffer]; 

Ma, la mia immagine di output generato è: enter image description here

ragazzi si prega di unirsi mani. Saluti.

Inoltre, grazie alla BradLarson.

+0

Bella domanda. Ho il compito simile e in questo momento sto cercando di risolverlo con due immagini: una per la maschera e l'altra per rilegatura. – Avt

+0

Questa è un'immagine di uscita davvero allarmante. – niksawtschuk

+0

Come primo passo, prova a scambiare gli indici di texture in questo modo: '[FullGpuImage addTarget: maskingFilter atIndex: 0];' [mascheraGpuImage addTarget: maskingFilter atIndex: 1]; "Verifica se ti avvicini di più all'output desiderato. – Jack

risposta

2

Non è necessario un filtro maschera, ma una miscela maschera alfa.

ho attuato uno here simili:

// GPUImage shader strings 
NSString * const kNBUAlphaMaskShaderString = SHADER_STRING 
(
varying highp vec2 textureCoordinate; 
varying highp vec2 textureCoordinate2; 

uniform sampler2D inputImageTexture; 
uniform sampler2D inputImageTexture2; 

void main() 
{ 
    lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 
    lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); 

    gl_FragColor = vec4(textureColor.xyz, textureColor2.a); 
} 
); 

continua semplicemente i colori da un'immagine e il canale alfa del secondo.

Poi create un GPUImageTwoInputFilter:

GPUImageTwoInputFilter * alphaMask = [[GPUImageTwoInputFilter alloc] initWithFragmentShaderFromString:kNBUAlphaMaskShaderString]; 

Non sono sicuro se un filtro miscela simile è stato aggiunto alla GPUImage da allora.


appena controllato di nuovo per vedere se c'è un built-in miscela che lo fa, e non c'è. Ma il filtro che ho usato come ispirazione è ancora lì (GPUImageAlphaBlendFilter). Unisce due immagini usando la maschera alfa per mescolarle. Il filtro sopra menzionato non richiede una seconda immagine "vuota".

+0

Thx. Inoltre, fammi provare anche questo. – itechnician

5

La maschera è la destinazione secondo, come si può vedere nel codice shader del filtro (textureColor2).

//Averages mask's the RGB values, and scales that value by the mask's alpha 
// 
//The dot product should take fewer cycles than doing an average normally 
// 
//Typical/ideal case, R,G, and B will be the same, and Alpha will be 1.0 

lowp float newAlpha = dot(textureColor2.rgb, vec3(.33333334, .33333334, .33333334)) * textureColor2.a; 

gl_FragColor = vec4(textureColor.xyz, newAlpha); 

allora avete bisogno di "invertire" la maschera: cuore bianco su sfondo nero, come il filtro utilizza il "peso" del valore RGB dei pixel per impostare il valore alfa l'immagine di destinazione su.

Così il vostro codice dovrebbe essere

// Image first, Mask next 
[FullGpuImage addTarget:maskingFilter]; 
[FullGpuImage processImage]; 

[maskingFilter useNextFrameForImageCapture]; 

[maskGpuImage addTarget:maskingFilter]; 
[maskGpuImage processImage];  

e la maschera (ok ho fatto un test rapido brutto, utilizzare una corretta immagine) come

white heart on black background

per il risultato atteso.

masked image

+0

Grazie fammi provare. – itechnician

Problemi correlati