Lorem ipsum dolor sit amet, consectetur adipiscing elit. Test link

chromaKeyFilter in Android

chromaKeyFilter in Android


private Bitmap chromaKeyFilter(Image image) {
    ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
    ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
    ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();

int ySize = yBuffer.remaining();
int uSize = uBuffer.remaining();
int vSize = vBuffer.remaining();

byte[] yuv = new byte[ySize + uSize + vSize];
yBuffer.get(yuv, 0, ySize);
uBuffer.get(yuv, ySize, uSize);
vBuffer.get(yuv, ySize + uSize, vSize);

int[] rgb = new int[previewSize.getWidth() * previewSize.getHeight()];
int[] yuvToRgb = new int[256];

for (int i = 0; i < 256; i++) {
    yuvToRgb[i] = (i - 16 < 0) ? 0 : (i - 16) * 255 / 219;
}

int yIndex = 0;
int uvIndex = ySize;

for (int i = 0; i < previewSize.getHeight(); i++) {
    for (int j = 0; j < previewSize.getWidth(); j++) {
        int y = yuv[yIndex++] & 0xff;
        int u = yuv[uvIndex++] & 0xff;
        int v = yuv[uvIndex++] & 0xff;

         u -= 128;
         v -= 128;

         int r = yuvToRgb[y] + (int) (1.13983 * v);
         int g = yuvToRgb[y] - (int) (0.39465 * u + 0.58060 * v);
         int b = yuvToRgb[y] + (int) (2.03211 * u);

         int pixel = (0xff << 24) | (r << 16) | (g << 8) | b;

         if (isGreen(pixel)) {
             pixel = Color.TRANSPARENT;
         }

         rgb[i * previewSize.getWidth() + j] = pixel;
     }
}

return Bitmap.createBitmap(rgb, previewSize.getWidth(), previewSize.getHeight(), Bitmap.Config.ARGB_8888);

}

private boolean isGreen(int pixel) {
    int r = (pixel >> 16) & 0xff;
    int g = (pixel >> 8) & 0xff;
    int b = pixel & 0xff;
    return (g > r && g > b && g - r > 20 && g - b > 20);
}
        

Post a Comment