使用RenderScript,我尝试使用ScriptIntrinsic3DLUT(http://developer.android.com/reference/android/renderscript/ScriptIntrinsic3DLUT.html)
一般来说,这个脚本就像任何其他renderscript一样工作
问题出在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。我只想知道如何/在哪里将这些字节放在分配中。这个分配的适当格式是什么?
答案 0 :(得分:3)
这会创建一个不会修改实际颜色值的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个字节。