1.使用 Android 原生画笔 colorMatrix 灰度图片
fun greyBitmap(originBitmap: Bitmap): Bitmap {
val newBitmap =
Bitmap.createBitmap(originBitmap.width, originBitmap.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(newBitmap)
val colorMatrix = ColorMatrix()
colorMatrix.setSaturation(0f)
val colorFilter = ColorMatrixColorFilter(colorMatrix)
val paint = Paint().apply {
isAntiAlias = true
setColorFilter(colorFilter)
}
canvas.drawBitmap(originBitmap, 0f, 0f, paint)
return newBitmap
}
2. 提取bitmap中的像素,对每一个像素分别操作
fun greyByPixel(originBitmap: Bitmap): Bitmap {
val dstBitmap =
Bitmap.createBitmap(originBitmap.width, originBitmap.height, Bitmap.Config.ARGB_8888)
val pixels = IntArray(originBitmap.width * originBitmap.height)
originBitmap.getPixels(
pixels,
0,
originBitmap.width,
0,
0,
originBitmap.width,
originBitmap.height
)
for (i in pixels.indices) {
var a = pixels[i].shr(24).and(0xff)
var r = pixels[i].shr(16).and(0xff)
var g = pixels[i].shr(8).and(0xff)
var b = pixels[i].and(0xff)
// final float R = 0.213f * invSat;
// final float G = 0.715f * invSat;
// final float B = 0.072f * invSat;
var grey = 0.213f * r + 0.715f * g + 0.072f * b
pixels[i] = a.shl(24).or(grey.toInt().shl(16)).or(grey.toInt().shl(8)).or(grey.toInt())
}
dstBitmap.setPixels(
pixels,
0,
originBitmap.width,
0,
0,
originBitmap.width,
originBitmap.height
)
return dstBitmap
}
3. 在 Native 层 操作 Pixels
JNIEXPORT jint JNICALL
Java_com_cailei_opencvndk_MainActivity_greyByOpenCV(JNIEnv *env, jobject thiz,
jobject origin_bitmap) {
AndroidBitmapInfo bitmapInfo;
// 获取 bitmap 的信息
int info = AndroidBitmap_getInfo(env, origin_bitmap, &bitmapInfo);
if (info != 0) {
return -1;
}
void *pixel;
// 拿到 bitmap 的像素
AndroidBitmap_lockPixels(env, origin_bitmap, &pixel);
for (int i = 0; i < bitmapInfo.width * bitmapInfo.height; i++) {
uint32_t *pixel_p = reinterpret_cast<uint32_t *>(pixel) + i;
uint32_t pixel = *pixel_p;
int a = (pixel >> 24) & 0xff;
int r = (pixel >> 16) & 0xff;
int g = (pixel >> 8) & 0xff;
int b = (pixel) & 0xff;
int grey = (int) (0.231f * r + 0.715f * g + 0.072f * b);
*pixel_p = (a << 24) | (grey << 16) | (grey << 8) | grey;
}
AndroidBitmap_unlockPixels(env, origin_bitmap);
return 1;
}
注意:需要添加链接 jnigraphics 这个so才能使用andorid/bitmap.h