无法从原始图像裁剪蒙版
Unable to crop mask from original image
我正在尝试从图像中删除背景。为此,我正在使用 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
}
}
从原始位图中裁剪蒙版后。我是 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
}
}
我正在尝试从图像中删除背景。为此,我正在使用 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
}
}
从原始位图中裁剪蒙版后。我是 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
}
}