Изменить цвет фона растрового изображения

#xml #android-studio #android-layout #android-fragments #android-styles

#xml #android-studio #android-макет #android-фрагменты #android-стили

Вопрос:

Я работаю над приложением для Android, которое должно изменять цвет изображения с помощью этой библиотеки https://github.com/divyanshub024/ColorSeekBar , проблема, с которой я сталкиваюсь, заключается в том, что я устанавливаю цвет фона изображения, он меняет только границы. У меня есть Imageview объект, который был преобразован из массива байтов в растровое изображение и установлен в ImageView .

  <ImageView
    android:id="@ id/img_bitmap1"
    android:layout_width="match_parent"
    android:layout_height="@dimen/_300sdp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginTop="@dimen/_10sdp"
    android:layout_marginStart="@dimen/_10sdp"
    android:layout_marginEnd="@dimen/_10sdp"
    />
  

Как я преобразую массив байтов в растровое изображение и настраиваю в ImageView

 val byteArray = intent.getByteArrayExtra("pictures")
    val bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
    img_bitmap1.setImageBitmap(bmp)
  

Как я меняю цвет

  val imageview = requireActivity()!!.findViewById<View>(R.id.img_bitmap1) as ImageView

    color_seek_bar.setOnColorChangeListener(object : ColorSeekBar.OnColorChangeListener {
        override fun onColorChangeListener(color: Int) {
            imageview.setBackgroundColor(color)
        }
    })
  

Комментарии:

1. Возможно, изображение, которое вы декодируете, имеет только границы, а не заливку 🙂

2. Я поделился своим XML-файлом Imageview выше, но я не добавил границ

Ответ №1:

вопрос в том, что показывает ваш ImageView , что содержит val bmp набор для него. ваша панель поиска правильно меняет фон, и вы видите только измененные границы, потому что «центр» изображения (почти весь) покрыт некоторыми bitmap

попробуйте НЕ загружать val bmp ImageView и не проверять, меняется ли весь фон, а не только фрейм

Комментарии:

1. На самом деле я должен загрузить это в ImageView и после этого изменить цвет изображения.

2. Но мне нужно изменить цвет изображения

3. Если я добавлю представление, оно полностью изменит свой цвет, но я хочу, чтобы содержимое в ImageView color изменилось,

4. итак, вы хотите раскрасить изображение, установленное для ImageView , а не ImageView само по себе? возможно, попробуйте использовать imageView.setColorFilter(Color.RED);

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

Ответ №2:

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

  var bitmap = (imageviewgradient.drawable as BitmapDrawable).bitmap
            var newBitmap = replaceColor(bitmap, color)
  

Приведенный выше код преобразует изображение в растровое изображение

     private fun replaceColor(src: Bitmap?, targetColor: Int): Bitmap? {
    if (src == null) {
        return null
    }
    // Source image size
    val width = src.width
    val height = src.height
    val pixels = IntArray(width * height)
    //get pixels
    src.getPixels(pixels, 0, width, 0, 0, width, height)
    for (x in pixels.indices) {
        if(pixels[x]!=-1) {
            pixels[x] = targetColor
        }
    }
    // create result bitmap output
    val result = Bitmap.createBitmap(width, height, src.config)
    //set pixels
    result.setPixels(pixels, 0, width, 0, 0, width, height)
    return result
}
  

Основная работа выполняется только с помощью простого условия, т.е.

 if(pixels[x]!=-1) {
            pixels[x] = targetColor
        }