美圖秀秀濾鏡之亮度調整,秀秀濾鏡亮度

來源:互聯網
上載者:User

美圖秀秀濾鏡之亮度調整,秀秀濾鏡亮度

  映像的亮度, 指的是映像像素的強度, 黑色為最暗, 白色為最亮, 在ios中黑色用0來表示, 白色用1來表示.一個像素, 基本上是用RGB三個顏色分量來表示的. R(0-1), G(0-1),B(0-1).

  亮度調整有多種計算方法,效果並不完全相同,在顏色的表示方法中, HSL(L)標記法就是:色相(hue)、飽和度(saturation)、亮度(lightness),改變其中的L值就可以調整圖象的亮度,但效果顯得比較生硬。

PhotoShop和GPUImage中採用的就是另外一種方法就是把圖象每個點顏色的RGB分量分別加上亮度調整值,這種效果相對比較柔和。下面是頂點著色器和片段著色器代碼(這些代碼運行於GPU中)。

  頂點著色

 attribute vec4 position; //輸入頂點位置屬性 attribute vec4 inputTextureCoordinate;//輸入紋理位置屬性  varying vec2 textureCoordinate;//輸出給片段著色器的紋理位置  void main() {     gl_Position = position;//輸出給片段著色器的頂點位置     textureCoordinate = inputTextureCoordinate.xy;//告訴片段著色器,頂點著色器正在處理的像素點。 }

  

  片段著色

 varying highp vec2 textureCoordinate;  uniform sampler2D inputImageTexture;//輸入的紋理圖片。也就是我們要處理的圖片 uniform lowp float brightness;//亮度值,我們在程式中可以調整的。  void main() {     lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);//輸入圖片的紋理顏色          gl_FragColor = vec4((textureColor.rgb + vec3(brightness)), textureColor.w);//像素著色顏色。將每個像素的RGB分量與亮度值相加,得到心的像素顏色。即演算法實現 }

 

在我的美圖秀秀中,使用的是上述演算法,而官方版不是

使用GPUImage的GPUImageBrightnessFilter來實現映像的亮度調整。

 

  具體應用

1.在GPUImageBrightnessFilter中首先初始化該濾鏡

GPUImageBrightnessFilter *filter = [[GPUImageBrightnessFilter alloc] init];

 

 

2.設定亮度值。該亮度值通過滑動UISlider來改變

filter.brightness = value;

 

 

3.設定亮度調整範圍為整張映像

[filter forceProcessingAtSize:image.size];

 

 

4.設定輸入映像紋理

GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];[pic addTarget:filter];

 

 

5.處理映像

[pic processImage];    [filter useNextFrameForImageCapture];

 

 

6.擷取處理後的映像

return [filter imageFromCurrentFramebuffer];

 

+ (UIImage *)changeValueForBrightnessFilter:(float)value image:(UIImage *)image;{    GPUImageBrightnessFilter *filter = [[GPUImageBrightnessFilter alloc] init];    filter.brightness = value;    [filter forceProcessingAtSize:image.size];    GPUImagePicture *pic = [[GPUImagePicture alloc] initWithImage:image];    [pic addTarget:filter];    [pic processImage];    [filter useNextFrameForImageCapture];    return [filter imageFromCurrentFramebuffer];}

 

 

附錄

在GPUImageBrightnessFilter的init方法中,設定了預設的亮度為0

- (id)init;{    if (!(self = [super initWithFragmentShaderFromString:kGPUImageBrightnessFragmentShaderString]))    {        return nil;    }        brightnessUniform = [filterProgram uniformIndex:@"brightness"];    self.brightness = 0.0;        return self;}

 

setBrightness方法調整映像的亮度值,_brightness為輸入的亮度值,在頂點著色器中uniform float brightness與brightnessUniform = [filterProgram uniformIndex:@"brightness"]對應,必須名字相同

- (void)setBrightness:(CGFloat)newValue;{    _brightness = newValue;        [self setFloat:_brightness forUniform:brightnessUniform program:filterProgram];}

 

下面我們預覽一下效果

    

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.