Применение эффекта Sepia, RGB, GrayScale к UIImage - PullRequest
5 голосов
/ 14 марта 2012

Я хочу применить эффекты фильтра к изображению в моем приложении.Я новичок в Open GL и хочу применить Сепия, RGB, GrayScale к изображению в моем приложении.Я реализовал эффекты Яркость, Контраст, Насыщенность , но не смог найти никакого решения по эффектам оттенков серого, RGB и сепии.

Заранее спасибо.

1 Ответ

5 голосов
/ 14 марта 2012

Вы не указываете, хотите ли вы сделать это в OpenGL ES 1.1 или 2.0, поэтому я предполагаю, что вы имеете в виду более новую версию 2.0.Если 1.1 действительно является вашей целью, вам нужно поиграть с режимами наложения, как Apple в их примере GLImageProcessing .

Для OpenGL ES 2.0 вы можете использовать фрагментные шейдеры для достижения каждого изэти эффекты.Для версии изображения в градациях серого вы можете извлечь только яркость, используя следующий фрагментный шейдер:

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

Для тона сепии вы можете использовать шейдер манипуляции с цветовой матрицей, который я демонстрирую в этого ответа:

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

с матрицей

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},
    };

Понятия не имею, что вы подразумеваете под «эффектом RGB».Возможно, вы имеете в виду манипулирование с цветовой матрицей, и в этом случае вышеприведенное будет работать и для вас.

Все это встроенные фильтры в моей открытой структуре GPUImage (см.GPUImageBrightnessFilter, GPUImageContrastFilter, GPUImageSaturationFilter, GPUImageSepiaFilter и GPUImageColorMatrixFilter).Если вы действительно новичок в OpenGL ES, вам понадобится совсем немного кода, чтобы настроить сцену, использовать UIImage в качестве текстуры, запустить вершинный и фрагментный шейдер, извлечь это изображение и сохранить его.вернуться как UIImage.GPUImage сделает все это за вас с помощью нескольких строк кода Objective-C.

...