今天因需要要求做了个图片加水印,以前都是在图片某个位置加水印,而这次要整个图片都是水印。
首先将水印图片进行倾斜处理,如下:
fun watermarkTilt(src: Bitmap): Bitmap { val width = src.getWidth() val height = src.getHeight() //创建一个bitmap val newb = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)// 创建一个新的和SRC长度宽度一样的位图 // 将该图片作为画布 val canvas = Canvas(newb) //将该文字图片逆时针方向倾斜45度 // canvas.rotate(-45f, width/2f, height/2f) //在画布 0,0坐标上开始绘制原始图片 canvas.drawBitmap(src, 0f, 0f, null) // 保存 canvas.save(Canvas.ALL_SAVE_FLAG) // 存储 canvas.restore() return newb }
然后将获取的水印倾斜的bitmap,再讲水印添加到图片上,如下:
fun addWaterMark(src: Bitmap, waterMark: Bitmap, gContext: Context): Bitmap{ val width = src.width val height = src.height val strwid = waterMark.width val strhei = waterMark.height val inter = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25f, gContext.getResources().getDisplayMetrics()) var markBitmap: Bitmap? = null try { markBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444) val canvas = Canvas(markBitmap!!) //在画布 0,0坐标上开始绘制原始图片 canvas.drawBitmap(src, 0f, 0f, null) var i = 0 while (i <= width) { var count = 0 var j = 0 while (j <= width) { if (count % 2 == 0) { canvas.drawBitmap(waterMark, i.toFloat(), j.toFloat(), null) // canvas.drawText(gText, i.toFloat(), j.toFloat(), paint) } else { //偶数行进行错开 canvas.drawBitmap(waterMark, (i + strwid / 2).toFloat(), j.toFloat(), null); // canvas.drawText(gText, (i + strwid / 2).toFloat(), j.toFloat(), paint) } j = (j.toFloat() + inter + strhei.toFloat()).toInt() count++ } i = (i.toFloat() + strwid.toFloat() + inter).toInt() } canvas.save(Canvas.ALL_SAVE_FLAG) // ACache.get(gContext).put(gText, markBitmap); } catch (e: OutOfMemoryError) { // Util.LOGD(TAG, e); if (markBitmap != null && !markBitmap.isRecycled) { markBitmap.recycle() markBitmap = null } } return markBitmap!! }大致思路注释上也写清楚了