我正试着从图像中移除背景。为此,我使用了TensorFlow,它为我提供了对象的掩码。在那之后,我从图像中剪切面具,但是效果并不像我想的那么好。
使用TensorFlow进行掩蔽:https://github.com/tensorflow/examples/tree/master/lite/examples/image_segmentation/android https://www.tensorflow.org/lite/examples/segmentation/overview
从图像中剪切掩码。
fun bitmapDstIn(mask: Bitmap?, original: Bitmap?): Bitmap? {
return try {
val result =
original?.let { Bitmap.createBitmap(it.width, it.height, Bitmap.Config.ARGB_8888) }
val mCanvas = result?.let { Canvas(it) }
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
mask?.let { mCanvas?.drawBitmap(it, 0f, 0f, null) }
original?.let { mCanvas?.drawBitmap(it, 0f, 0f, paint) }
paint.xfermode = null
result
} catch (e: Exception) {
println(e.message.toString())
original
}
}

发布于 2022-05-09 06:39:01
在从原始位图中剪切掩码之后。我是SRC_OVER,结果位图两次,它隐藏了透明度问题。
fun creatingMasking(original: Bitmap?, mask: Bitmap?): Bitmap? {
return try {
var result: Bitmap? =
mask?.let { original?.let { it1 -> croppingMaskFromOriginal(it, it1) } }
val final = result
result = result?.let { overlay(it, it) }
result = result?.let { final?.let { it1 -> overlay(it, it1) } }
result
} catch (e: Exception) {
original
} catch (e: OutOfMemoryError) {
original
}
}
private fun croppingMaskFromOriginal(base: Bitmap, blend1: Bitmap): Bitmap {
return try {
val result: Bitmap =
base.copy(Bitmap.Config.ARGB_8888, true)
val blend = Bitmap.createScaledBitmap(blend1, base.width, base.height, false)
val p = Paint()
p.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
p.shader = BitmapShader(blend, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)
p.alpha = 255
val c = Canvas()
c.setBitmap(result)
c.drawBitmap(base, 0f, 0f, null)
c.drawRect(0f, 0f, base.width.toFloat(), base.height.toFloat(), p)
result
} catch (e: Exception) {
base
} catch (e: OutOfMemoryError) {
base
}
}
private fun overlay(base: Bitmap, blend1: Bitmap): Bitmap {
return try {
val result: Bitmap =
base.copy(Bitmap.Config.ARGB_8888, true)
val blend = Bitmap.createScaledBitmap(blend1, base.width, base.height, false)
val p = Paint()
p.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)
p.shader = BitmapShader(blend, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)
val c = Canvas()
c.setBitmap(result)
c.drawBitmap(base, 0f, 0f, null)
c.drawRect(0f, 0f, base.width.toFloat(), base.height.toFloat(), p)
result
} catch (e: Exception) {
base
} catch (e: OutOfMemoryError) {
base
}
}https://stackoverflow.com/questions/72151498
复制相似问题