android影象處理系列之六--給圖片新增邊框(下)-圖片疊加
阿新 • • 發佈:2018-11-19
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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多倍。因為這種圖片疊加是對畫素點處理,是後面的特效處理系列,因為涉及到圖片疊加,所以放到前面來。具體怎麼使用,後面也會很快討論到,讀者也可以自己研究。優化的程式碼會在後面貼出來,敬請期待。