Android 實(shí)現(xiàn)圖片生成卷角和圓角縮略圖的方法
在 Android 的一些界面中,有時(shí)候我們需要為一副圖片生成大小為 n * n 的縮略圖,有時(shí)候需要的縮略圖特殊一些,比如:
1、帶圓角的縮略圖:
如果我們需要帶圓角的縮略圖,但提供的圖片是 n * n 的正方形的圖片,該怎么辦?這時(shí)候可以在貼圖之前,先利用 Paint.setXfermode 方法來設(shè)置圖片疊加時(shí)的混合模式,從而達(dá)到目的。一般而言,使用方法如下:
Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XXX); canvas.drawBitmap(srcBmp, rc, rc, paint);
關(guān)于 PorterDuff.Mode 的值,確定了 SrcBmp 和 DstBmp 交疊時(shí)像素的處理方式,其作用用一幅圖片展示如下:

我們看出 SrcIn 這個(gè)模式,只保留 SrcBmp 和 DstBmp 直接的交集部分,并且只展現(xiàn) SrcBmp 上這部分交集的內(nèi)容。這個(gè)模式適合我們做帶圓角的縮略圖。我們先在 Canvas 上繪制一個(gè)實(shí)心圓角矩形,其他部分透明,然后用這個(gè)模式把縮略圖再繪制到 Canvas 上即可:
Bitmap roundThumbBitmap = Bitmap.createBitmap( rc.width(), rc.height(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(roundThumbBitmap); Paint paint = new Paint(); paint.setColor(0xFFFF0000); // 任何不透明的顏色均可。(作為掩碼色) paint.setAntiAlias(true); // 開啟抗鋸齒,防止圓角毛躁. // 填充一個(gè)圓角矩形. final float radius = 5.0f; canvas.drawRoundRect(new RectF(rc), radius, radius, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(srcBmp, rc, rc, paint);
做出的效果如下:

2、帶 “卷角+圓角” 的縮略圖:
有時(shí)候,我們需要為一張普通的圖片生成 “卷角+圓角” 效果的圖,像這樣:

這時(shí)候,我們可以用兩張輔助圖來實(shí)現(xiàn)這個(gè)效果,一張底圖做掩碼,得到 “圓角+左上角切角” 的效果,然后用另一張圖片覆蓋在上面,得到 “灰色邊框+右上角卷角” 的效果,我們需要的兩張圖如下:

代碼如下:
Bitmap rollAngleThumbBmp = Bitmap.createBitmap(rc.width(), rc.height(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(rollAngleThumbBmp); Bitmap maskBmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.mask); Bitmap borderBmp = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.border)).getBitmap(); Paint paint = new Paint(); paint.setAntiAlias(true); // 先貼掩碼圖. canvas.drawBitmap(maskBmp, rc, rc, paint); // 再用 SrcIn 的模式貼縮略圖. paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(srcBmp, rc, rc, paint); // 先取消 Xfermode. paint.setXfermode(null); // 再貼邊框卷角圖. canvas.drawBitmap(borderBmp, rc, rc, paint);
得到的效果如下(看起來有些毛躁,純屬是我切的 mask 和 border 圖片的問題,不是方法的問題):

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android基于OpenCV實(shí)現(xiàn)霍夫直線檢測
霍夫變換利用點(diǎn)與線之間的對(duì)偶性,將圖像空間中直線上離散的像素點(diǎn)通過參數(shù)方程映射為霍夫空間中的曲線,并將霍夫空間中多條曲線的交點(diǎn)作為直線方程的參數(shù)映射為圖像空間中的直線。給定直線的參數(shù)方程,可以利用霍夫變換來檢測圖像中的直線。本文簡單講解Android的實(shí)現(xiàn)2021-06-06
Android中的Notification機(jī)制深入理解
這篇文章主要給大家介紹了關(guān)于Android中Notification機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
Android實(shí)現(xiàn)閃屏及注冊和登錄界面之間的切換效果
這篇文章主要介紹了Android實(shí)現(xiàn)閃屏及注冊和登錄界面之間的切換效果,實(shí)現(xiàn)思路是先分別實(shí)現(xiàn)閃屏、注冊界面、登錄界面的活動(dòng),再用Intent將相關(guān)的活動(dòng)連接起來,實(shí)現(xiàn)不同活動(dòng)之間的跳轉(zhuǎn),對(duì)android 實(shí)現(xiàn)閃屏和界面切換感興趣的朋友一起看看吧2016-11-11
android studio生成aar包并在其他工程引用aar包的方法
本篇文章主要介紹了android studio生成aar包并在其他工程引用aar包的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
提升Android應(yīng)用視覺吸引效果的10個(gè)UI設(shè)計(jì)技巧
在Android應(yīng)用開發(fā)中,風(fēng)格和設(shè)計(jì)或許不是最關(guān)鍵的要素,但它們在決定Android應(yīng)用成功與否上確實(shí)扮演重要的角色,以下是10個(gè)Android應(yīng)用的UI設(shè)計(jì)技巧,還有個(gè)附加技巧,感興趣的朋友可以了解下哦2013-01-01

