操作位图中的颜色 android
manipulate the colours in a Bitmap android
我有一个二维码,我想将其颜色更改为白色和蓝色...
我可以使用以下代码来完成:
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)
但这太慢了...所以我想知道什么是更快地做同样事情的最佳方法。
您可以设置 Drawable 色调:
val bitmap: Bitmap = ...
val bitmapDrawable = BitmapDrawable(resources, bitmap)
DrawableCompat.setTint(bitmapDrawable, Color.BLUE)
在尝试了不同的解决方案后,我意识到唯一的办法就是操纵像素。
以下代码是目前最优解:
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
}
msc87 已接受答案的注释,
将 pixelsArray 保存回位图使用:
bitmap.setPixels(pixelsArray,0,mWidth,0,0,mWidth,maskHeight)
您还可以将 getColour 替换为:(如果需要)
Color.argb(255,0,177,64)
等..
我有一个二维码,我想将其颜色更改为白色和蓝色... 我可以使用以下代码来完成:
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)
但这太慢了...所以我想知道什么是更快地做同样事情的最佳方法。
您可以设置 Drawable 色调:
val bitmap: Bitmap = ...
val bitmapDrawable = BitmapDrawable(resources, bitmap)
DrawableCompat.setTint(bitmapDrawable, Color.BLUE)
在尝试了不同的解决方案后,我意识到唯一的办法就是操纵像素。 以下代码是目前最优解:
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
}
msc87 已接受答案的注释,
将 pixelsArray 保存回位图使用:
bitmap.setPixels(pixelsArray,0,mWidth,0,0,mWidth,maskHeight)
您还可以将 getColour 替换为:(如果需要)
Color.argb(255,0,177,64)
等..