инверсии bitmap на Kotlin, она работает хорошо, но довольно медленно
private fun invert(bitmap: Bitmap): Bitmap? {
val width = bitmap.width
val height = bitmap.height
val pixels = width * height
val pixel = IntArray(pixels)
bitmap.getPixels(pixel, 0, width, 0, 0, width, height)
for (i in 0 until pixels) pixel[i] = pixel[i] xor 0x00FFFFFF
bitmap.setPixels(pixel, 0, width, 0, 0, width, height)
return bitmap
}
В ndk у меня получилась вот такая реализация
extern "C"
JNIEXPORT jobject JNICALL
Java_com_music_notationproject_CCode_invertWithC(JNIEnv *env, jobject _, jobject bitmap) {
AndroidBitmapInfo bitmap_info;
AndroidBitmap_getInfo(env, bitmap, &bitmap_info);
if (bitmap_info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) return nullptr;
void *pixels;
AndroidBitmap_lockPixels(env, bitmap, &pixels);
u_long pixelsCount = bitmap_info.height * bitmap_info.width;
auto* pixel = new u_int[pixelsCount];
memcpy(pixel, pixels, sizeof(u_int) * pixelsCount);
for (u_long i = 0; i < pixelsCount; ++ i) pixel[i] = 0xff000000 | ~pixel[i];
memcpy(pixels, pixel, sizeof(u_int) * pixelsCount);
AndroidBitmap_unlockPixels(env, bitmap);
delete[] pixel;
return bitmap;
}
Она отображает картину со скриншотов, если убрать pixel[i] = 0xff000000 | ~pixel[i];, то изображение отображается верно, но без инверсии
Где я ошибся?
xor в с++ вроде был ^
тебе просто нужен ColorMatrixColorFilter
Обсуждают сегодня