1. 程式人生 > >Android - 利用擴充套件函式為Bitmap新增時間水印

Android - 利用擴充套件函式為Bitmap新增時間水印

<異空間>專案技術分享系列——擴充套件函式為Bitmap新增文字水印 對圖片Bitmap繪製文字水印還是比較常見的需求,畢竟版權意識都在增強(使用者可以給自己圖片加上使用者名稱),還可以為使用者提供更多的資訊(例如視訊縮圖) 先上效果圖(比較簡單的效果,可繼續擴充套件實現),以下程式碼使用**Kotlin**語言編寫 ### 給Bitmap新增文字水印 首先注意不能對進行拉伸或縮放前的Bitmap進行繪製水印,否則水印也會一起被拉伸縮放 應該提前將Bimap拉伸,再進行繪製操作 示例程式碼: ```kotlin //將Bitmap進行縮放,獲得縮放完成後的Bitmap後,再繪製文字水印 bitmap?.let {thumb ->
bitmap = Bitmap.createScaledBitmap( //縮放 thumb , ConvertUtils.dp2px(140F), ConvertUtils.dp2px(100F),false ) .addTextWatermark(length , ConvertUtils.dp2px(16F) , Color.WHITE ,0F,0F,false) } ``` `addTextWatermark` 方法是對Bitmap類的一個擴充套件方法(Kotlin) 下面示例程式碼目前只實現了在右下角繪製,可繼續擴充套件: ```kotlin /** * 給一張Bitmap新增水印文字。 * * @param content 水印文字 * @param textSize 水印字型大小 ,單位pix。 * @param color 水印字型顏色。 * @param x 起始座標x * @param y 起始座標y * @param recycle 是否回收 * @return 已經新增水印後的Bitmap */ fun Bitmap.addTextWatermark( content: String?,//文字內容 textSize: Int, //文字大小 color: Int, //文字顏色 x: Float, //x,y暫時比較難用,因為要指定具體位置,難以在外部直接測量文字的座標 y: Float, recycle: Boolean //Bitmap記憶體是否回收 ): Bitmap? { if ( content == null) return null val ret = this.copy(this.config, true) val paint = Paint(Paint.ANTI_ALIAS_FLAG) val canvas = Canvas(ret) paint.color = color paint.textSize = textSize.toFloat() //繪製文字 val bounds = Rect() paint.getTextBounds(content, 0, content.length, bounds) //預設在 Bitmap的 右下角位置開始繪製文字 canvas.drawText(content, this.width.toFloat()-bounds.width() - 20F , this.height.toFloat() - bounds.height() + 20F, paint) if (recycle && !this.isRecycled) this.recycle() return ret } ``` ### 補充 #### Bitmap載入進ImageView,為什麼會形狀各異,是因為設定了不同的縮放方式 設定ImageView填充方式的前提是使用**src**作為設定圖片的來源,否則的話,會導致圖片填充方式設定無效的情況。 - scaleType=“**matrix**” 是保持原圖大小、從左上角的點開始,以矩陣形式繪圖。 - scaleType=“**fitXY**” 是將原圖進行橫方向(即XY方向)的拉伸後繪製的。 - scaleType=“**fitStart**” 是將原圖沿左上角的點(即matrix方式繪圖開始的點),按比例縮放原圖繪製而成的。 - scaleType=“**fitCenter**” 是將原圖沿上方居中的點(即matrix方式繪圖第一行的居中的點),按比例縮放原圖繪製而成的。 - scaleType=“**fitEnd**” 是將原圖沿下方居中的點(即matrix方式繪圖最後一行的居中的點),按比例縮放原圖繪製而成的。 - scaleType=“**Center**” 是保持原圖大小,以原圖的幾何中心點和ImagView的幾何中心點為基準,只繪製ImagView大小的影象。 - scaleType=“**centerCrop**” 不保持原圖大小,以原圖的幾何中心點和ImagView的幾何中心點為基準,只繪製ImagView大小的影象(以填滿ImagView為目標,對原圖進行裁剪)。 - scaleType=“**centerInside**” 不保持原圖大小,以原圖的幾何中心點和ImagView的幾何中心點為基準,只繪製ImagView大小的影象(以顯示完整圖片為目標,對原圖進行縮放)。 ![圖源網路,侵則刪](https://picbed-dmingou.oss-cn-shenzhen.aliyuncs.com/img/70.png) 希望對有需要的人有幫