Android - 利用擴展函數為Bitmap添加文字水印


<異空間>項目技術分享系列——擴展函數為Bitmap添加文字水印

對圖片Bitmap繪制文字水印還是比較常見的需求,畢竟版權意識都在增強(用戶可以給自己圖片加上用戶名),還可以為用戶提供更多的信息(例如視頻縮略圖)

先上效果圖(比較簡單的效果,可繼續擴展實現),以下代碼使用Kotlin語言編寫

941614648553_.pic

給Bitmap添加文字水印

首先注意不能對進行拉伸或縮放前的Bitmap進行繪制水印,否則水印也會一起被拉伸縮放

應該提前將Bimap拉伸,再進行繪制操作

示例代碼:

//將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)

下面示例代碼目前只實現了在右下角繪制,可繼續擴展:

    /**
     * 給一張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大小的圖像(以顯示完整圖片為目標,對原圖進行縮放)。

圖源網絡,侵則刪

希望對有需要的人有幫助~😊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM