Не удается получить правильный пиксель из изображения, возвращенного с камеры - PullRequest
2 голосов
/ 08 июля 2019

Я пытаюсь загрузить в режиме просмотра изображения изображение, возвращаемое камерой устройства, и получить цвета пикселя, к которому я прикоснулся.

Я пытался масштабировать изображение в xml-файле, но когда я это делаю, хотя я вижу, что изображение вписывается в представление изображения, сенсорный сенсор работает с исходными размерами изображения. Если я не масштабирую его, я вижу только ту часть изображения, которая соответствует изображению, и сенсорный сенсорный экран получает фактический пиксель.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
        bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath)
        ivCamera.setImageBitmap(bitmap)
        ivCamera.setOnTouchListener { view, motionEvent ->
            val bmp = (ivCamera.drawable as BitmapDrawable).bitmap
            val pixel = bmp.getPixel(motionEvent!!.x.toInt(), motionEvent.y.toInt())
            pixelRed = Color.red(pixel)
            pixelGreen = Color.green(pixel)
            pixelBlue = Color.blue(pixel)
            tvColor.setBackgroundColor(Color.rgb(pixelRed!!, pixelGreen!!, pixelBlue!!))
            true
        }
    }
}


   <ImageView android:layout_width="match_parent"
           android:layout_weight="0.7"
           android:layout_height="0dp"
           android:id="@+id/ivCamera"
           android:scaleType="matrix"
           android:background="@android:drawable/ic_menu_report_image"
           app:layout_constraintEnd_toEndOf="parent"
           android:layout_marginEnd="8dp"
           android:layout_marginStart="8dp"
           app:layout_constraintHorizontal_bias="0.498"
           android:layout_margin="10dp"
           android:layout_marginBottom="8dp"
           android:adjustViewBounds="true"
           app:layout_constraintBottom_toBottomOf="parent"
           android:contentDescription="PicureTaken"/>

Если я масштабирую изображение в xml-файле, я вижу изображение, встроенное в просмотр изображений, но сенсорный сенсор работает с исходными размерами изображения. Если я не масштабирую его, я вижу только ту часть изображения, которая соответствует изображению, и сенсорный сенсор получает фактический пиксель.

1 Ответ

0 голосов
/ 08 июля 2019

Это может быть один из тех безумных сценариев, когда вы настраиваете сенсорный слушатель ivCamera.setOnTouchListener до того, как тип масштаба XML вступил в силу ivCamera.setImageBitmap. то есть он устанавливает исходные размеры до того, как scaleType вступит в силу.

Вы можете использовать прослушиватель макета для настройки прослушивателя касания после того, как ImageView закончит надуваться.

https://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener

ivCamera.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            ivCamera.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            if(ivCamera.getDrawable() != null) {
                  ivCamera.setOnTouchListener {
                  // etc
                  // ...
            }

        }
    });

Это не ответ, в котором я уверен, а ответ. :-) извините, это так ужасно / такой взлом!


Глядя на это снова ...

 val bmp = (ivCamera.drawable as BitmapDrawable).bitmap
 val pixel = bmp.getPixel(motionEvent!!.x.toInt(), motionEvent.y.toInt())

Вы получаете растровое изображение обратно из ImageView, затем вызываете getPixel, однако ясно, .bitmap возвращает вам исходный размер растрового изображения, даже если вы масштабировали его (для вида) с помощью scaleType.

Я бы рекомендовал либо перевести координаты x / y события касания в масштабированный размер изображения.

Или масштабируйте растровое изображение самостоятельно, прежде чем вызывать setImageBitmap в ImageView. Таким образом, вам не нужно переводить х / у.

...