import android.graphics.*
import android.graphics.Paint.ANTI_ALIAS_FLAG
import android.graphics.Paint.DITHER_FLAG
import androidx.annotation.ColorInt
options: WatermarkOptions = WatermarkOptions()
val result = bitmap.copy(bitmap.config, true)
val canvas = Canvas(result)
val paint = Paint(ANTI_ALIAS_FLAG or DITHER_FLAG)
paint.textAlign = when (options.corner) {
Corner.BOTTOM_LEFT -> Paint.Align.LEFT
Corner.BOTTOM_RIGHT -> Paint.Align.RIGHT
val textSize = result.width * options.textSizeToWidthRatio
paint.textSize = textSize
paint.color = options.textColor
if (options.shadowColor != null) {
paint.setShadowLayer(textSize / 2, 0f, 0f, options.shadowColor)
if (options.typeface != null) {
paint.typeface = options.typeface
val padding = result.width * options.paddingToWidthRatio
calculateCoordinates(watermarkText, paint, options, canvas.width, canvas.height, padding)
canvas.drawText(watermarkText, coordinates.x, coordinates.y, paint)
private fun calculateCoordinates(
options: WatermarkOptions,
val x = when (options.corner) {
val y = when (options.corner) {
paint.getTextBounds(watermarkText, 0, watermarkText.length, bounds)
val textHeight = bounds.height()
data class WatermarkOptions(
val corner: Corner = Corner.BOTTOM_RIGHT,
val textSizeToWidthRatio: Float = 0.04f,
val paddingToWidthRatio: Float = 0.03f,
@ColorInt val textColor: Int = Color.WHITE,
@ColorInt val shadowColor: Int? = Color.BLACK,
val typeface: Typeface? = null