我如何从用户的图库中获取图像,然后将其转换为位图,然后使用它来生成调色板?

How do I get an image from the user's gallery and then convert it to bitmap and then use it to generate a color palette?

注意:我能在此处找到的关于堆栈溢出的大多数答案要么已过时(并使用了已弃用的方法),要么密切相关但对我的情况并不完全有用

我正在制作一个应用程序,可以根据用户输入的图像生成调色板。我正在使用 this Jetpack library 为了达成这个。我是一个菜鸟,以前从未处理过位图或此类意图。我相信启动图像选择器的代码应该如下所示:

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 或已过时并使用已弃用的方法。

我想在用户按下按钮时从用户那里获取图像,以某种方式将其转换为可在调色板库中使用的位图。从生成的调色板中获取主色作为十六进制颜色或其他可用格式并自行处理。

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,它是流行 Java 库的 Java脚本端口:

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

所以@blackapps 回答了这个问题,这个问题的解决方案是通过传入图像 URI 来启动带有内容解析器的输入流。获得 URI 后,使用位图工厂解码流,然后 return 你的位图。

val inputStream = contentResolver.openInputStream(selectedImageUri)
val bitmap = BitmapFactory.decodeStream(inputStream)