2012-03-14 2 views
5

Deseo aplicar efectos de filtro a la imagen en mi aplicación. Soy nuevo en Open GL & quiero aplicar Sepia, RGB, efecto GrayScale a la imagen en mi aplicación. Tengo implementado Brillo, Contraste, Efectos de saturación, pero no he podido encontrar ninguna solución en Escala de grises, RGB & efecto sepia.Aplicación de Sepia, RGB, efecto GrayScale a UIImage

Gracias de antemano.

+0

eche un vistazo http://stackoverflow.com/questions/3549396/image-processing-glamour-filter-in-iphone – janusbalatbat

+0

@niks ¿Puede proporcionar el código de brillo, contraste y saturación? – Nassif

Respuesta

5

No especifica si desea hacer esto en OpenGL ES 1.1 o 2.0, así que supongo que se está refiriendo a la 2.0 más reciente. Si 1.1 es tu objetivo, deberás jugar con modos de fusión como lo hace Apple en su GLImageProcessing example.

Para OpenGL ES 2.0, puede usar sombreadores de fragmentos para lograr cada uno de estos efectos. Para una versión de escala de grises de una imagen, puede extraer sólo la luminancia utilizando la siguiente shader fragmento:

precision highp float; 

varying vec2 textureCoordinate; 

uniform sampler2D inputImageTexture; 

const highp vec3 W = vec3(0.2125, 0.7154, 0.0721); 

void main() 
{ 
    float luminance = dot(texture2D(inputImageTexture, textureCoordinate).rgb, W); 

    gl_FragColor = vec4(vec3(luminance), 1.0); 
} 

Para un tono sepia, se puede emplear el shader manipulación de matriz de color demuestro en this answer:

varying highp vec2 textureCoordinate; 

uniform sampler2D inputImageTexture; 

uniform lowp mat4 colorMatrix; 
uniform lowp float intensity; 

void main() 
{ 
    lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); 
    lowp vec4 outputColor = textureColor * colorMatrix; 

    gl_FragColor = (intensity * outputColor) + ((1.0 - intensity) * textureColor); 
} 

con una matriz de

self.colorMatrix = (GPUMatrix4x4){ 
     {0.3588, 0.7044, 0.1368, 0}, 
     {0.2990, 0.5870, 0.1140, 0}, 
     {0.2392, 0.4696, 0.0912 ,0}, 
     {0,0,0,0}, 
    }; 

que no tienen idea de lo que entendemos por "efecto RGB". Tal vez te refieres a la manipulación de la matriz de color, en cuyo caso lo anterior también funcionará para ti en ese caso.

Todos estos son filtros incorporados dentro de mi marco de código abierto GPUImage (ver el GPUImageBrightnessFilter, GPUImageContrastFilter, GPUImageSaturationFilter, GPUImageSepiaFilter y GPUImageColorMatrixFilter). Si eres realmente un recién llegado al OpenGL ES, te llevará bastante código para configurar tu escena, tomar tu UIImage como una textura, ejecutar un vertex y fragmentar el sombreado, recuperar esa imagen y guardarla volver a salir como un UIImage. GPUImage hará todo eso por ti con unas pocas líneas de código Objective-C.