美圖秀秀濾鏡之亮度調整

来源:http://www.cnblogs.com/salam/archive/2016/01/10/5118704.html
-Advertisement-
Play Games

圖像的亮度, 指的是圖像像素的強度, 黑色為最暗, 白色為最亮, 在ios中黑色用0來表示, 白色用1來表示.一個像素, 基本上是用RGB三個顏色分量來表示的. R(0-1), G(0-1),B(0-1). 亮度調整有多種計算方法,效果並不完全相同,在顏色的表示方法中, HSL(L)表示法就是...


  圖像的亮度, 指的是圖像像素的強度, 黑色為最暗, 白色為最亮, 在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];
}

 

下麵我們預覽一下效果

    

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、登陸到伺服器2、新建一個文件夾來保存webmin,建議在個人用戶下新建。,3、下載Webmin的安裝文件,命令是:wget http://prdownloads.sourceforge.net/webadmin/webmin-1.670.tar.gz到官網下載也可,我喜歡用wget命令來下載。4...
  • SQL Server中所有全局變數都使用兩個@符號作為首碼--1.@@error 最後一個T-SQL錯誤的錯誤號(目的是或得違反約束的錯誤號)insert into Subject values('測試工程師')--違反了約束select @@ERROR --2.@@identity 最後一次插入的...
  • SQL Server 2008中的全局變數及其用法T-SQL程式中的變數分為全局變數和局部變數兩類,全局變數是由SQL Server系統定義和使用的變數。DBA和用戶可以使用全局變數的值,但不能自己定義全局變數。下麵詳細總結一下SQL Server 2008中的33個全局變數,並且寫一下示例.@@....
  • 在學習SQL編程前,先給大家分享幾個段子吧,咱先樂呵樂呵! 《桃花庵--程式員版》寫字樓里寫字間,寫字間中程式員;程式人員寫程式,又將程式換酒錢;酒醒只在屏前坐,酒醉還來屏下眠;酒醉酒醒日復日,屏前屏下年復年;但願老死電腦間,不願鞠躬老闆前;賓士寶馬貴者趣,公交自行程式員;別人笑我太瘋癲,我笑自己命...
  • 有時候忘掉了mysql的root密碼,這種情況下,如何重置root的密碼呢?找到並編輯mysql的my.ini配置文件,在mysqld節點中添加上skip-grant-table. 如下:[mysqld]# These let you safely reset the lost root passw...
  • 集合運算符是針對兩個集合操作的,兩個集合必須有相同的列數;列具有相同的數據類型(至少能夠隱式轉換的);最終輸出的集合的列名是,由第一個集合的列名來確定的(可以用來連接多個結果)。註意:聯合【Union】與連接不一樣【Join】。 聯合:將多個結果集,合併為一個結果集。Union(去除重覆,相當...
  • 在前陣子寫的一篇博文“SQL SERVER 2014 下IF EXITS 居然引起執行計劃變更的案例分享”里介紹了資料庫從SQL SERVER 2005升級到 SQL SERVER 2014後,發現一個SQL出現性能問題,當時分析後發現執行計劃變了,導致SQL出現了性能問題。但是沒有徹底搞清楚為什麼...
  • 1.在代碼里實現this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標題欄,this指當前的Activity這句代碼一定要加在setContentView()前面。this.requestWindowFeature(Window.FEATUR...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...