Как мне получить изображение из галереи пользователя, а затем преобразовать его в растровое изображение, а затем использовать его для создания цветовой палитры?

Примечание. Большинство ответов, которые я мог найти здесь о переполнении стека, были либо устаревшими (и использовались устаревшие методы), либо были тесно связаны, но не совсем полезны для моего случая

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

const val PICK_IMAGE = 1

class MainActivity : AppCompatActivity() {

    private lateinit var openGalleryButton: Button

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

        openGalleryButton = findViewById(R.id.open_gallery_button)
        openGalleryButton.setOnClickListener {
            val photoPickerIntent = Intent(Intent.ACTION_PICK)
            photoPickerIntent.type = "image/*"
            startActivityForResult(photoPickerIntent, PICK_IMAGE)
        }
    }

}

Тогда я думаю, что мне нужно переопределить onActivityResult() и что-то там сделать? Но что бы я ни делал, я не могу заставить это работать. Я НЕ собираюсь устанавливать это изображение на какой-либо ImageView, и большинство ответов на подобные проблемы отвечают только на то, как установить изображение на ImageView, или они устарели и используют устаревшие методы.

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


person Sbeve Sbren    schedule 14.01.2021    source источник
comment
да. В onActivityResult откройте InputStream для полученного uri. Затем используйте BitmapFactory.decodeStream для создания растрового изображения.   -  person blackapps    schedule 14.01.2021
comment
@blackapps, не могли бы вы рассказать мне немного больше о том, как открыть входной поток?   -  person Sbeve Sbren    schedule 14.01.2021
comment
getContentResolver (). openInputStream (data.getData ()); Теперь сначала опубликуйте свой код onActivityResult в новом блоке кода, если у вас есть дополнительные вопросы.   -  person blackapps    schedule 14.01.2021
comment
Это сработало! Большое спасибо. Но есть ли альтернативы? Я думаю, что использовать входной поток - это своего рода хакерство, поскольку он совершенно не связан с проблемой. Я полный нуб и ничего не знаю, поэтому, пожалуйста, скажите мне, что я совершенно не прав.   -  person Sbeve Sbren    schedule 14.01.2021
comment
Я не понимаю ваших сомнений. Для создания растрового изображения предлагаемый мною код - ИДЕАЛЬНЫЙ путь. То, что вы хотите сделать с растровым изображением, - это совсем другое.   -  person blackapps    schedule 14.01.2021
comment
Нет-нет, я не говорю, что это неправильный путь. Просто странно, сколько существует решений, но ни одно из них не работает. Как мне узнать, стоит ли мне использовать этот или какой-нибудь другой в Интернете. Ваше решение было единственным, что сработало   -  person Sbeve Sbren    schedule 14.01.2021
comment
Большая часть кода в Интернете устарела и не работает на новых ОС. Смотрите, есть ли дата публикации.   -  person blackapps    schedule 14.01.2021
comment
Я тоже нашел это. Я не пробовал, но стоит ли использовать курсор? Даже не знаю, что такое на самом деле курсор, никогда с ним не разбирался. pastebin.com/XjX9J84a   -  person Sbeve Sbren    schedule 14.01.2021
comment
Нет. Это даже близко не похоже на те две линейки, которые у вас есть сейчас, и не будет работать на Android 10.   -  person blackapps    schedule 14.01.2021


Ответы (2)


https://github.com/SvenWoltmann/color-thief-java

Вот некоторая логика, которая может быть полезна для вашего проекта. Фрагмент простого кода:

var colorThief = new ColorThief();

var sourceImage = document.getElementById("image");

// Display main color
// e.g [125, 189, 193]
console.log(
    colorThief.getColor(sourceImage)
);

// Display palette of colors
// e.g [[55,37,29],[213,193,136],[110,204,223]]
console.log(
    colorThief.getPalette(sourceImage)
);

Или вы можете использовать Vibrant, порт JavaScript популярной библиотеки Java:

http://jariz.github.io/vibrant.js/

person Greg    schedule 14.01.2021
comment
Я пробовал читать этот код, но действительно не понимаю. я чувствую, что это слишком продвинуто для меня. - person Sbeve Sbren; 14.01.2021
comment
@SbeveSbren, пожалуйста, проверьте добавленный мной фрагмент кода - person Greg; 14.01.2021
comment
Прошу прощения, если это глупый вопрос, но является ли Color Thief библиотекой? Могу ли я добавить эту библиотеку в свой проект? - person Sbeve Sbren; 14.01.2021

Итак, на вопрос ответил @blackapps, и решение этой проблемы - запустить поток ввода с преобразователем контента, передав URI изображения. После того, как вы получите URI, декодируйте поток с помощью фабрики растровых изображений, а затем она вернет вам ваше растровое изображение.

val inputStream = contentResolver.openInputStream(selectedImageUri)
val bitmap = BitmapFactory.decodeStream(inputStream)
person Sbeve Sbren    schedule 16.01.2021