transformers icon indicating copy to clipboard operation
transformers copied to clipboard

CropCircleWithBorderTransformation

Open WeiLianYang opened this issue 1 year ago • 1 comments

CropCircleWithBorderTransformation when calculating the border there is a bug. If the width and height of the picture are not equal, then the width of the outer border is set to be wider than the actual value.

bugs

Code :

        val url = "https://pic.52112.com/JPG-180507/180507_295/hILItGsZAG_small.jpg"
        viewBinding.ivImage.load(url) {
            transformations(CropCircleWithBorderTransformation(10.dp, "#00ff00".toColorInt()))
        }

WeiLianYang avatar Sep 25 '23 06:09 WeiLianYang

fix:


class CropCircleWithBorder constructor(
    private val borderSize: Int,
    private val borderColor: Int
) : Transformer() {

    override fun transform(
        source: Bitmap,
        destination: Bitmap
    ): Bitmap {

        CropCircle().transform(source, destination)

        destination.density = source.density
        destination.setHasAlpha(true)

        val minSize = minOf(source.width, source.height)
        val maxSize = maxOf(source.width, source.height)
        val strokeSize = borderSize * 1f * minSize / maxSize
        val radius = minSize / 2f

        val paint = Paint().apply {
            color = borderColor
            style = Paint.Style.STROKE
            strokeWidth = strokeSize
            isAntiAlias = true
            isFilterBitmap = true
        }
        val canvas = Canvas(destination)
        canvas.drawCircle(radius, radius, radius - strokeSize / 2f, paint)
        canvas.setBitmap(null)

        return destination
    }

    override fun key(): String = "$id(borderSize=$borderSize, borderColor=$borderColor)"
}

WeiLianYang avatar Sep 25 '23 06:09 WeiLianYang