乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android色彩矩陣

       老匹夫 2019-12-03

      在Android的開發(fā)中,我們少不了對(duì)圖片進(jìn)行處理,其中最常使用的數(shù)據(jù)結(jié)構(gòu)就是位圖Bitmap,它包含了一張圖片的所有數(shù)據(jù)。

      既然是位圖那它就是由一個(gè)個(gè)像素點(diǎn)組成的。每一個(gè)像素點(diǎn)都會(huì)有其對(duì)應(yīng)的顏色值——ARGB,分別對(duì)應(yīng)透明度、紅、綠、藍(lán)這四個(gè)分量。它們共同決定了每個(gè)像素點(diǎn)顯示的顏色。

      色彩矩陣概念

      在Android中圖片是以RGBA像素點(diǎn)的形式加載到內(nèi)存中的,修改這些像素信息需要一個(gè)叫做ColorMatrix類的支持。ColorMatrix就是Android系統(tǒng)使用的色彩矩陣。

      Android中的顏色矩陣是一個(gè)4×5的數(shù)字矩陣:

      這里寫圖片描述

      在Android中他會(huì)以一維數(shù)組的形式來存儲(chǔ):(float[]類型)

      [ a, b, c, d, e,f, g, h, i, j,k, l, m, n, o,p, q, r, s, t ]

      一般我們?yōu)榱丝勺x性,我們會(huì)寫得好看些:

      new float[]{
          a, b, c, d, e,
          f, g, h, i, j,
          k, l, m, n, o,
          p, q, r, s, t 
          };

      那這個(gè)矩陣該怎么使用呢?其實(shí)就是使用矩陣乘法運(yùn)算。

      這里有一個(gè)色彩矩陣分量C,代表著我們要進(jìn)行色彩變化的原色彩。

      矩陣R則代表通過矩陣乘法運(yùn)算AC而得到的新的顏色。

      這里寫圖片描述

      通過矩陣乘法可知:

      這里寫圖片描述

      通過這個(gè)公式我們就可以得出我們的色彩矩陣A的意義:

      這里寫圖片描述

      • 第一行的abcde值用來決定新的顏色值中的R
      • 第二行的fghij值用來決定新的顏色值中的G
      • 第三行的klmno值用來決定新的顏色值中的B
      • 第四行的pqrdt值用來決定新的顏色值中的A
      • 其中第五列ejot值分別用來決定每個(gè)分量重的offset,即偏移量

      Android中我們可以通過如下語句來創(chuàng)建我們的色彩矩陣:

      ColorMatrix colorMatrix = new ColorMatrix();

      這個(gè)語句會(huì)創(chuàng)建一個(gè)初始矩陣A,即:

      這里寫圖片描述

      跟這個(gè)矩陣相乘的顏色分量是不會(huì)改變的,即

      這里寫圖片描述

      之前說了矩陣是通過一維數(shù)組的形式來存儲(chǔ)的,所以我們也可以通過如下語句創(chuàng)建我們想要的色彩矩陣:

      ColorMatrix colorMatrix = new ColorMatrix(new float[]{  
              0.5F, 0, 0, 0, 0,  
              , 0.5F, 0, 0, 0,  
              , 0, 0.5F, 0, 0,  
              , 0, 0, 1, 0,  
      });  

      我們也可以使用如下語句將我們的矩陣變成數(shù)組形式:

      float colorMatrixArray[] = colorMatrix.getArray();

      色彩矩陣的基礎(chǔ)就講到這,下面我們來看怎么使用色彩矩陣改變顏色值吧。

      用色彩矩陣改變顏色值

      使用色彩矩陣改變顏色值一般有三種方法:
      1. 直接改變色彩矩陣的offset偏移量
      2. 直接改變對(duì)應(yīng)RGBA值的系數(shù)
      3. 使用封裝好的API來改變參數(shù)

      改變偏移量

      當(dāng)我們改變矩陣A的R、G所對(duì)應(yīng)的偏移量:

      這里寫圖片描述

      這樣最后處理的結(jié)果就會(huì)使紅色綠色分量增加100。我們知道,紅色混合綠色會(huì)得到黃色,所以最后處理結(jié)果就是讓整個(gè)圖像的色調(diào)偏黃

      改變顏色系數(shù)

      這里寫圖片描述

      在上面這個(gè)矩陣中,改變了G分量所對(duì)應(yīng)的系數(shù)g,這樣在矩陣運(yùn)算后G分量會(huì)變?yōu)橐郧暗膬杀?,最終效果就是圖像的色調(diào)更加偏綠。

      使用封裝好的API

      圖像的色調(diào)、飽和度、亮度這三個(gè)屬性在圖像處理中使用的非常多。

      谷歌官方提供了一些API來供我們快速調(diào)整這些參數(shù):

      這里寫圖片描述

      • 色調(diào)

        setRotate(int axis, float degrees)用來幫我們設(shè)置色調(diào)

      • 飽和度

        setSaturation(float sat)用來設(shè)置顏色的飽和度

      • 亮度

        setScale(float rScale, float gScale, float bScale, float aScale)用來調(diào)整亮度

      具體的使用方法還是去查手冊吧,因?yàn)檫@些顏色的玩意我自己也不是很懂=。=

      色彩矩陣的使用

      其實(shí)說白了,色彩矩陣就是用來改變顏色的。

      但是有人會(huì)問,改變顏色我們直接setColor不就行了,哪用這么麻煩。是的,如果我們只是改變純色的圖片確實(shí)使用setColor會(huì)方便得多,但是我們要改變一張照片的顏色呢?setColor明顯就行不通了。

      下面我們結(jié)合具體的例子來演示一下色彩矩陣的使用方法。

      如果我們想整體的改變一張圖像的顏色,不可能對(duì)這張圖像的每一個(gè)像素點(diǎn)分別與色彩矩陣相乘,谷歌官方肯定有幫我們封裝好可用的API。

      這時(shí)候就要請(qǐng)出我們的“畫筆”Paint了。

      Paint有一個(gè)方法:

      setColorFilter(ColorFilter filter)

      直譯就是“設(shè)置顏色過濾”。我們需要傳入一個(gè)ColorFilter。

      這個(gè)ColorFilter跟進(jìn)源碼查看發(fā)現(xiàn)沒有和圖像處理相關(guān)的方法,但是它有三個(gè)子類:ColorMatrixColorFilter, LightingColorFilter, PorterDuffColorFilter

      可以看到我們的ColorMatrix出現(xiàn)了,所以這個(gè)ColorMatrixColorFilter就是我們要使用的子類。

      好吧,廢話不多說,我們直接寫一個(gè)小demo,這個(gè)demo是一個(gè)自定義的view,這個(gè)view中只顯示一張照片:

      public class MyColorMatrix extends View {
          private Paint mPaint;// 畫筆
          private Bitmap bitmap;// 位圖
          public MyColorMatrix(Context context) {
              this(context, null);
          }
          public MyColorMatrix(Context context, AttributeSet attrs) {
              super(context, attrs);
              // 初始化畫筆
              mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
              // 獲取位圖
              bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.photo);
          }
          @Override
          protected void onDraw(Canvas canvas) {
              super.onDraw(canvas);
              // 繪制位圖
              canvas.drawBitmap(bitmap, , 0, mPaint);
          }
      }

      效果如下:

      這里寫圖片描述

      此時(shí)使用我們的setColorFilter進(jìn)行色彩的改變

      public class MyColorMatrix extends View {
          private Paint mPaint;// 畫筆
          private Bitmap bitmap;// 位圖
          public MyColorMatrix(Context context) {
              this(context, null);
          }
          public MyColorMatrix(Context context, AttributeSet attrs) {
              super(context, attrs);
              // 初始化畫筆
              mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
              // 生成色彩矩陣
              ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                      , 0, 0, 0, 0,
                      , 2F, 0, 0, 0,
                      , 0, 1, 0, 0,
                      , 0, 0, 1, 0,
              });
              mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
              // 獲取位圖
              bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.photo);
          }
          @Override
          protected void onDraw(Canvas canvas) {
              super.onDraw(canvas);
              // 繪制位圖
              canvas.drawBitmap(bitmap, , 0, mPaint);
          }
      }

      這里我們的矩陣用的是

       ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                      , 0, 0, 0, 0,
                      , 2F, 0, 0, 0,
                      , 0, 1, 0, 0,
                      , 0, 0, 1, 0,
              });

      效果如下:

      這里寫圖片描述

      因?yàn)槲覀兏淖兞祟伾禂?shù),所以會(huì)使圖片偏綠。

      好了,這就是色彩矩陣的使用方法。但是很明顯的,對(duì)于不是美術(shù)出身的我們,想要實(shí)現(xiàn)某種圖片效果我們也不知道怎么改這個(gè)色彩矩陣???怎么辦?

      其實(shí)這不用擔(dān)心,這個(gè)早有大神做好了研究,我們直接拿來用即可。

      常用圖像色彩矩陣處理效果

      研究圖像色彩處理的人,正是研究如何通過某種算法,將對(duì)應(yīng)的顏色矩陣值作用到原圖像上,從而形成新的色彩風(fēng)格的圖像。下面我就例舉一些比較常用的色彩處理效果:

      灰度效果

      色彩矩陣:

      ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                      0.33F, 0.59F, 0.11F, 0, 0,
                      0.33F, 0.59F, 0.11F, 0, 0,
                      0.33F, 0.59F, 0.11F, 0, 0,
                      , 0, 0, 1, 0,
              });

      效果如下:

      這里寫圖片描述

      圖像反轉(zhuǎn)

      色彩矩陣:

      ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                      -, 0, 0, 1, 1,
                      , -1, 0, 1, 1,
                      , 0, -1, 1, 1,
                      , 0, 0, 1, 0,
              });

      這里寫圖片描述

      懷舊效果

      ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                      0.393F, 0.769F, 0.189F, 0, 0,
                      0.349F, 0.686F, 0.168F, 0, 0,
                      0.272F, 0.534F, 0.131F, 0, 0,
                      , 0, 0, 1, 0,
              });

      這里寫圖片描述

      去色效果

      ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                      1.5F, 1.5F, 1.5F, 0, -1,
                      1.5F, 1.5F, 1.5F, 0, -1,
                      1.5F, 1.5F, 1.5F, 0, -1,
                      , 0, 0, 1, 0,
              });

      這里寫圖片描述

      高飽和度

      ColorMatrix colorMatrix = new ColorMatrix(new float[]{
                      1.438F, -0.122F, -0.016F, 0, -0.03F,
                      -0.062F, 1.378F, -0.016F, 0, 0.05F,
                      -0.062F, -0.122F, 1.483F, 0, -0.02F,
                      , 0, 0, 1, 0,
              });

      這里寫圖片描述

      以上就是常用的圖像處理的色彩矩陣。

      關(guān)于色彩矩陣的知識(shí)也大致講完了,如果有什么不正確的地方歡迎指出。

      本文參考《Android群英傳》

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多