Как получить позицию касания и убрать фон с картинки на android? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую ручной выбор касания на экране, чтобы пользователь мог выбрать интересующую область для удаления фона. Для этого я разрабатываю приложение в Kotlin с использованием opencv. То, как вы в настоящее время выполняете это удаление, всего двумя касаниями пользователя на экране, образуя квадрат в области выбора. Это хорошо работает для небольших изображений, но для больших изображений фоновое усечение не работает хорошо. Для этого лучшим решением было бы получить эти координаты при свободном выборе изображения, где пользователь может отметить всю границу интересующей области. Может ли кто-нибудь помочь мне внести это изменение в мой код. Код ниже делает выбор изображения и обрезает заднюю часть.

enter image description here

enter image description here

КОД :

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    check(OpenCVLoader.initDebug(), { Toast.makeText(this, "OpenCV was not initialized properly", Toast.LENGTH_SHORT).show() })

    rxPermissions = RxPermissions(this)

    image.setOnTouchListener { _, event ->
        if (!isPhotoChosen()) {
            return@setOnTouchListener false
        }
        if (event.action == MotionEvent.ACTION_DOWN) {
            val bounds = getBitmapPositionInsideImageView(image)
            val xScaled = (event.x / bounds[4]) - bounds[0]
            val yScaled = (event.y / bounds[5]) - bounds[1]
            if (!hasChosenTopLeft()) {
                coordinates.first.apply {
                    x = xScaled.toDouble()
                    y = yScaled.toDouble()
                }
            } else if (!hasChosenBottomRight()) {
                with(Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.RGB_565)) {
                    coordinates.second.apply {
                        x = xScaled.toDouble()
                        y = yScaled.toDouble()
                    }
                    val rectPaint = Paint().apply {
                        setARGB(255, 0, 255, 0)
                        style = Paint.Style.STROKE
                        strokeWidth = 4f
                    }
                    Canvas(this).apply {
                        drawBitmap(bitmap, 0f, 0f, null)
                        drawRect(coordinates.first.x.toFloat(), coordinates.first.y.toFloat(), coordinates.second.x.toFloat(), coordinates.second.y.toFloat(), rectPaint)
                    }
                    image.setImageDrawable(BitmapDrawable(resources, this))
                }

            } else {
                resetTarget()
            }
        }
        true
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...