1. 程式人生 > >android影象處理系列之六--給圖片新增邊框(下)-圖片疊加

android影象處理系列之六--給圖片新增邊框(下)-圖片疊加

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

前面介紹了一種用透明圖片疊加的方式新增花邊邊框,下面將介紹另外一種圖片疊加新增花邊邊框的方式。前面方法有一個缺點,就是做成PNG圖片,圖片體積會很大,不是一般的大,比同樣的JPG大三倍多,如果專案可以忽略包的大小,那麼可以用前種處理方式,本文講到的雖然可以減小圖片的體積,但處理較複雜,而且本人研究的還不是很成熟。本文就是針對JPG邊框處理,但缺點是還不夠成熟,僅提供思路。

思路:可以將邊框做成JPG圖片,沒有邊框的地方,一般都是中間區域調成特殊顏色,比如黑色。在兩張圖片疊加的時候,對邊框圖片做特殊處理,比如是黑色的點過濾掉,改變邊框圖片畫素點的透明度,即可完成前面PNG圖片的效果。

下面看效果:

+

目前程式碼處理的還不是很好,非黑色點與黑色點的交界處沒有做模糊處理,具體方法後面的文章會講到。一樣的邊框圖片建議放在assets目錄。

下面貼程式碼:

<pre name="code" class="java">/**  * 疊加邊框圖片有用部分  * @param bmp  * @return  */
 private Bitmap alphaLayer(Bitmap bmp) {  int width = bmp.getWidth();  int height = bmp.getHeight();  Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);    // 邊框圖片  Bitmap overlay = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.black);  int
w = overlay.getWidth();  int h = overlay.getHeight();  float scaleX = width * 1F / w;  float scaleY = height * 1F / h;  Matrix matrix = new Matrix();  matrix.postScale(scaleX, scaleY);    Bitmap overlayCopy = Bitmap.createBitmap(overlay, 0, 0, w, h, matrix, true);    int pixColor = 0;  int layColor = 0;  int newColor = 0;    int pixR = 0;  int pixG = 0;  int pixB = 0;  int pixA = 0;    int newR = 0;  int newG = 0;  int newB = 0;  int newA = 0;    int layR = 0;  int layG = 0;  int layB = 0;  int layA = 0;    float alpha = 0.3F;  float alphaR = 0F;  float alphaG = 0F;  float alphaB = 0F;  for (int i = 0; i < width; i++)  {   for (int k = 0; k < height; k++)   {    pixColor = bmp.getPixel(i, k);    layColor = overlayCopy.getPixel(i, k);        // 獲取原圖片的RGBA值    pixR = Color.red(pixColor);    pixG = Color.green(pixColor);    pixB = Color.blue(pixColor);    pixA = Color.alpha(pixColor);        // 獲取邊框圖片的RGBA值    layR = Color.red(layColor);    layG = Color.green(layColor);    layB = Color.blue(layColor);    layA = Color.alpha(layColor);        // 顏色與純黑色相近的點    if (layR < 20 && layG < 20 && layB < 20)    {     alpha = 1F;    }    else    {     alpha = 0.3F;    }        alphaR = alpha;    alphaG = alpha;    alphaB = alpha;        // 兩種顏色疊加    newR = (int) (pixR * alphaR + layR * (1 - alphaR));    newG = (int) (pixG * alphaG + layG * (1 - alphaG));    newB = (int) (pixB * alphaB + layB * (1 - alphaB));    layA = (int) (pixA * alpha + layA * (1 - alpha));        // 值在0~255之間    newR = Math.min(255, Math.max(0, newR));    newG = Math.min(255, Math.max(0, newG));    newB = Math.min(255, Math.max(0, newB));    newA = Math.min(255, Math.max(0, layA));        newColor = Color.argb(newA, newR, newG, newB);    bitmap.setPixel(i, k, newColor);   }  }      return bitmap; }


 

這種方式圖片處理比較慢,因為畫素點要一個個getPixel(),組成新圖片的時候要一個個setPixel()。另外可以用getPixels(),和setPixels()方法,這種處理要快一點,本人對其它類似效果的處理測試了一下,後面處理方式要比前面快3多倍。因為這種圖片疊加是對畫素點處理,是後面的特效處理系列,因為涉及到圖片疊加,所以放到前面來。具體怎麼使用,後面也會很快討論到,讀者也可以自己研究。優化的程式碼會在後面貼出來,敬請期待。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述