2012-12-14 33 views
3

我想要創建一個圖像的反轉,作爲應用程序的一部分。 我使用openGL實現了一些圖像處理,遵循Apple的GLImageProcessing演示。iOS openGL image invert

我的圖像從.jpg加載並加載到紋理。我可以愉快地修改對比度和亮度。

但是,在嘗試創建反轉圖像時(交換黑色爲白色),我的結果不盡人意。 我試過幾種方法,但沒有在設備上正常工作。到目前爲止,我試過了; glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); 這在模擬器中運行良好,但在設備上會產生不穩定的結果。 我也試過了; glBlendFunc(GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_DST_COLOR); 這產生了和以前一樣的結果。 最後,我試了一下; glLogicOp(GL_XOR); 這只是在圖像和黑屏之間切換。

你能提出一個(相對)簡單的解決方案來顛倒我的形象嗎?

+0

這是灰度圖像嗎?爲此編寫着色器如何? –

+0

圖像是灰度,是的。 –

回答

1

這樣如何着色器:

void main() { 
    vec4 color = texture2D(texture, textureCoordinate); 
    float inverted = 1.0 - color.r; 
    vec4 inverted_vec = vec4(vec3(inverted), 1.0); 
    gl_FragColor = clamp(inverted_vec, 0.0, 1.0);" 
}; 
0

如果沒有透明度,我建議你先畫一個白色矩形在圖像應該是(沒有質感,只是純白色)。然後使用glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR)並禁用alpha通道glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE)並繪製灰度紋理。如果你不需要透明度,這應該會給你想要的效果,在其他情況下,你應該使用附加了紋理的FBO來做同樣的事情。同樣在繪製紋理後,重新啓用alpha通道。

1

如果您可以使用OpenGL ES 2.0(您應該能夠安全地完成這項工作,只需要很少的1.1版本的設備),一個簡單的方法是使用我的開源框架GPUImage和它的GPUImageColorInvertFilter。

下面的代碼從磁盤加載圖像,創建一個顏色反轉過濾器,應用該過濾器,然後吐出一個UIImage供您使用:

UIImage *inputImage = [UIImage imageNamed:@"image.jpg"]; 
GPUImageColorInvertFilter *stillImageFilter = [[GPUImageColorInvertFilter alloc] init]; 
UIImage *quickFilteredImage = [stillImageFilter imageByFilteringImage:inputImage]; 

如果你想只顯示所產生的圖像到屏幕上,或將其用作紋理,則可以將過濾器指向GPUImageView或GPUImageTextureOutput,以避免某些Core Graphics開銷(由於生成輸出UIImage)。