如何在ScriptIntrinsic3DLUT上分配LUT?

时间:2014-10-16 10:01:06

标签: android renderscript

使用RenderScript,我尝试使用ScriptIntrinsic3DLUT(http://developer.android.com/reference/android/renderscript/ScriptIntrinsic3DLUT.html

一般来说,这个脚本就像任何其他renderscript一样工作

  • 创建RS上下文
  • 使用此上下文创建脚本
  • 创建输入和输出分配
  • 设置脚本参数
  • 调用内核

问题出在set script parameters步骤,我应该调用script.setLUT (Allocation lut)的文档,但是为此分配生成/设置值的适当方法是什么?

我的代码示例是:

// create RS context
RenderScript rs = RenderScript.create(context);

// create output bitmap
Bitmap bitmapOut = Bitmap.createBitmap(bitmapIn.getWidth(), bitmapIn.getHeight(), bitmapIn.getConfig());

// create bitmap allocations
Allocation allocIn = Allocation.createFromBitmap(rs, bitmapIn);
Allocation allocOut = Allocation.createFromBitmap(rs, bitmapOut);

// create script
ScriptIntrinsic3DLUT script = ScriptIntrinsic3DLUT.create(rs, Element.U8_4(rs));

// set 3D LUT for the script
how to create the `Allocation lut` ??
script.setLUT(lut);

// process the script
script.forEach(allocIn, allocOut);

// copy result to bitmap output
allocOut.copyTo(bitmapOut);

我的问题类似于How to use ScriptIntrinsic3DLUT with a .cube file?

但它不一样。我不关心多维数据集文件。我可以从字节,整数,矩阵等数组创建LUT。我只想知道如何/在哪里将这些字节放在分配中。这个分配的适当格式是什么?

2 个答案:

答案 0 :(得分:3)

我在网上找到了一个例子: https://android.googlesource.com/platform/frameworks/rs/+/master/java/tests/ImageProcessing/src/com/android/rs/image/ColorCube.java

这会创建一个不会修改实际颜色值的3D LUT。很好的例子,虽然它如何工作。

private ScriptIntrinsic3DLUT mIntrinsic;
private void initCube() {
        final int sx = 32;
        final int sy = 32;
        final int sz = 16;
        Type.Builder tb = new Type.Builder(mRS, Element.U8_4(mRS));
        tb.setX(sx);
        tb.setY(sy);
        tb.setZ(sz);
        Type t = tb.create();
        mCube = Allocation.createTyped(mRS, t);
        int dat[] = new int[sx * sy * sz];
        for (int z = 0; z < sz; z++) {
            for (int y = 0; y < sy; y++) {
                for (int x = 0; x < sx; x++ ) {
                    int v = 0xff000000;
                    v |= (0xff * x / (sx - 1));
                    v |= (0xff * y / (sy - 1)) << 8;
                    v |= (0xff * z / (sz - 1)) << 16;
                    dat[z*sy*sx + y*sx + x] = v;
                }
            }
        }
        mCube.copyFromUnchecked(dat);
    }

然后像这样使用它

mIntrinsic.setLUT(mCube);

如果有人可以帮助解析 .cube 文件并适合这一点,我将非常感激。

答案 1 :(得分:1)

在调用脚本上的forEach()方法之前,您需要设置LUT。 LUT数据是像素格式RGBA,Element.U8_4并且是3维。因此,您需要根据数据数组创建Allocation,该数据数组具有足够的空间,可用于3维*每像素4个字节。