манипулировать цветами в растровом Android - PullRequest
0 голосов
/ 28 февраля 2019

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

val bitmap = qrgEncoder.encodeAsBitmap()
        val width = bitmap.width
        val height = bitmap.height
        // All are 0, or black, by default
        for (y in 0 until height) {
            for (x in 0 until width) {
                bitmap.getPixel(x, y).also {
                    if(it != -1)
                        bitmap.setPixel(x, y, ResourcesCompat.getColor(resources, R.color.defaultTextColor, null))
                    else
                        bitmap.setPixel(x, y, ResourcesCompat.getColor(resources, R.color.toolbarColor, null))
                }
            }
        }
        // Setting Bitmap to ImageView
        qrImage.setImageBitmap(bitmap)

, но это слишком медленно ... так что яинтересно, как лучше всего сделать то же самое и быстрее.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

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

val pixelsArray = IntArray(mWidth * mHeight)
val newColor1 = getColor(context!!, R.color.color1)
val newColor2 = getColor(context!!, R.color.color2)
bitmap.getPixels(pixelsArray, 0, mWidth, 0, 0, mWidth, mHeight)
for (y in 0 until pixelsArray.size) {
    if (pixelsArray[y] != -1)
        pixelsArray[y] = newColor1
    else
    pixelsArray[y] = newColor2
}
0 голосов
/ 28 февраля 2019

Вы можете установить оттенок Drawable:

https://developer.android.com/reference/android/support/v4/graphics/drawable/DrawableCompat.html#setTint(android.graphics.drawable.Drawable,%20int)

val bitmap: Bitmap = ...

val bitmapDrawable = BitmapDrawable(resources, bitmap)

DrawableCompat.setTint(bitmapDrawable, Color.BLUE)
...