其他分享
首页 > 其他分享> > 如何将颜色LUT应用于位图图像以获取android中的滤镜效果?

如何将颜色LUT应用于位图图像以获取android中的滤镜效果?

作者:互联网

这里我对android中的LUT有疑问.

我的问题是,我有4X4 LUT,使用这些LUT对android中的位图图像应用滤镜效果.下面是我的示例LUT文件链接.
Lut link sample

它在android中可能吗?如果可能请帮助我如何申请.

提前致谢.

解决方法:

我正在研究一个LUT应用程序库,它可以简化在Android中使用LUT图像的过程.它使用下面的algorythm,但我希望将来增强它以优化内存使用.现在它还猜测了LUT的颜色轴:
https://github.com/dntks/easyLUT/wiki

你的LUT图像的红绿蓝颜色尺寸与我以前的颜色尺寸不同,所以我必须改变获取lutIndex的顺序(在getLutIndex()).
请检查我编辑的答案:

final static int X_DEPTH = 16;
final static int Y_DEPTH = 16; //One little square has 16x16 pixels in it
final static int ROW_DEPTH = 4;
final static int COLUMN_DEPTH = 4; // the image consists of 4x4 little squares
final static int COLOR_DISTORTION = 16; // 256*256*256 => 256 no distortion, 64*64*64 => 256 dividied by 4 = 64, 16x16x16 => 256 dividied by 16 = 16

private Bitmap applyLutToBitmap(Bitmap src, Bitmap lutBitmap) {
    int lutWidth = lutBitmap.getWidth();
    int lutColors[] = new int[lutWidth * lutBitmap.getHeight()];
    lutBitmap.getPixels(lutColors, 0, lutWidth, 0, 0, lutWidth, lutBitmap.getHeight());

    int mWidth = src.getWidth();
    int mHeight = src.getHeight();
    int[] pix = new int[mWidth * mHeight];
    src.getPixels(pix, 0, mWidth, 0, 0, mWidth, mHeight);

    int R, G, B;
    for (int y = 0; y < mHeight; y++)
        for (int x = 0; x < mWidth; x++) {
            int index = y * mWidth + x;
            int r = ((pix[index] >> 16) & 0xff) / COLOR_DISTORTION;
            int g = ((pix[index] >> 8) & 0xff) / COLOR_DISTORTION;
            int b = (pix[index] & 0xff) / COLOR_DISTORTION;

            int lutIndex = getLutIndex(lutWidth, r, g, b);

            R = ((lutColors[lutIndex] >> 16) & 0xff);
            G = ((lutColors[lutIndex] >> 8) & 0xff);
            B = ((lutColors[lutIndex]) & 0xff);
            pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
        }
    Bitmap filteredBitmap = Bitmap.createBitmap(mWidth, mHeight, src.getConfig());
    filteredBitmap.setPixels(pix, 0, mWidth, 0, 0, mWidth, mHeight);
    return filteredBitmap;
}

//the magic happens here
private int getLutIndex(int lutWidth, int redDepth, int greenDepth, int blueDepth) {
    int lutX = (greenDepth % ROW_DEPTH) * X_DEPTH + blueDepth;
    int lutY = (greenDepth / COLUMN_DEPTH) * Y_DEPTH + redDepth;
    return lutY * lutWidth + lutX;
}

标签:android,bitmap,lookup-tables
来源: https://codeday.me/bug/20190609/1202976.html