我试图制作一个为图像填充颜色的应用程序。使用 Java 可以正常工作,但由于一些性能问题,我想使用渲染脚本填充位图。我用谷歌搜索了很多关于渲染脚本的东西,但我没有任何合适的东西。请大家指导我如何使用渲染脚本填充位图。任何帮助将不胜感激。谢谢
问问题
209 次
1 回答
0
您必须做的基本事情是Allocation
为输入创建一个,然后为输出创建Bitmap
一个可变的。假设您有一个名为它的输入位图,它可能看起来像这样:Bitmap
Allocation
inputBitmap
private RenderScript mRsCtx; // RenderScript context, created during init
private ScriptC_bitmapFill mFill; // RS kernel instance, created during init
.
.
.
public Bitmap doFill(Bitmap inputBitmap) {
// Ensure your input bitmap is also in ARGB8888
Bitmap output = Bitmap.createBitmap(inputBitmap.getWidth(),
inputBitmap.getHeight(),
Bitmap.Config.ARGB_8888);
Allocation outAlloc = Allocation.createFromBitmap(mRsCtx, output);
Allocation inAlloc = Allocation.createFromBitmap(mRsCtx, inputBitmap);
// Now call your kernel then copy back the results
mFill.forEach_root(inAlloc, outAlloc);
outAlloc.copyTo(outBitmap);
return outBitmap;
}
如果您只是填充整个图像甚至一个区域,那么您将拥有一个 RS 内核,它会在调用内核时更改特定位置的像素值。这是一个非常简单的 RS 内核,它只是用纯色填充整个图像:
#pragma version(1)
#pragma rs java_package_name(com.example.bitmapfill)
void root(const uchar4 *v_in, uchar4 *v_out) {
v_out->r = 0x12;
v_out->g = 0x34;
v_out->b = 0x56;
}
请注意,由于在这种情况下您并没有真正对输入分配/位图做任何事情(只是填充整个事物),您可以省略输入分配并使用尺寸。但是,如果您只想操作输入的一部分(一小部分),那么您将不得不将其他像素从输入复制到输出,而不是填充。
有关 RS 及其一些内部结构、性能等的更多信息,您可能会发现此演讲很有用:https ://youtu.be/3ynA92x8WQo
于 2018-09-04T10:33:19.897 回答