2014-05-12 16 views
9

Tôi cần cắt từ Hình ảnh đầy đủ bằng cách sử dụng mặt nạ và tạo Hình ảnh có mặt nạ.Cách triển khai GPUImageMaskFilter bằng cách sử dụng GPUImage

Full Image+Mask Image=enter image description here

tôi thử như sau:

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

Nhưng, hình ảnh đầu ra được tạo ra của tôi là: enter image description here

kẻ Hãy chung tay. Chúc mừng.

Ngoài ra, nhờ BradLarson.

+0

Câu hỏi hay. Tôi có nhiệm vụ tương tự và bây giờ cố gắng giải quyết nó với hai hình ảnh - một cho mặt nạ và một cho ràng buộc. – Avt

+0

Đó thực sự là một hình ảnh đầu ra đáng báo động. – niksawtschuk

+0

Là bước đầu tiên, hãy thử đổi các chỉ mục kết cấu như sau: '[FullGpuImage addTarget: maskingFilter atIndex: 0];' '[maskGpuImage addTarget: maskingFilter atIndex: 1];' Xem điều đó có giúp bạn gần hơn với kết quả mong muốn của bạn không. – Jack

Trả lời

2

Bạn không cần bộ lọc mặt nạ mà là một mặt nạ alpha pha trộn.

tôi thực hiện một here như thế này:

// 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); 
} 
); 

Đơn giản chỉ cần giữ cho màu sắc từ một hình ảnh và các kênh alpha của một giây.

Sau đó create một GPUImageTwoInputFilter:

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

Tôi không chắc chắn nếu một bộ lọc hỗn hợp tương tự đã được thêm vào GPUImage kể từ đó.


Chỉ cần kiểm tra lại để xem có sự pha trộn sẵn có không và không có. Nhưng bộ lọc pha trộn tôi sử dụng làm cảm hứng vẫn còn đó (GPUImageAlphaBlendFilter). Nó kết hợp hai hình ảnh bằng cách sử dụng mặt nạ alpha để trộn chúng. Bộ lọc được đề cập ở trên không yêu cầu hình ảnh "trống" thứ hai.

+0

Thx. Ngoài ra, hãy để tôi thử cái này nữa. – itechnician

5

Mặt nạ là mục tiêu giây thứ hai, như có thể thấy trong mã bộ lọc bộ lọc (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); 

Sau đó, bạn cần "đảo ngược" mặt nạ của bạn: trái tim màu trắng trên nền đen, khi bộ lọc sử dụng "trọng lượng" của giá trị pixel RGB để đặt giá trị alpha trên hình ảnh đích.

Vì vậy, mã của bạn nên được

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

[maskingFilter useNextFrameForImageCapture]; 

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

và mặt nạ của bạn (ok tôi đã làm một thử nghiệm nhanh chóng xấu xí, sử dụng một hình ảnh thích hợp) như

white heart on black background

cho kết quả mong đợi.

masked image

+0

Cảm ơn hãy để tôi thử. – itechnician

Các vấn đề liên quan