android - 我可以将 Renderscript 上的输入和输出分配设置为不同的大小/维度吗?

标签 android rotation renderscript

背景

我正在尝试学习Renderscript,所以我想尝试做一些我想到的简单操作。

问题

我想到了旋转位图,这很容易管理。

在 C/C++ 上,这是一件简单的事情(搜索“jniRotateBitmapCw90”):

https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations/blob/master/JniBitmapOperationsLibrary/jni/JniBitmapOperationsLibrary.cpp

事实是,当我在 Renderscript 上尝试此操作时,出现此错误:

android.support.v8.renderscript.RSRuntimeException: Dimension mismatch between parameters ain and aout!

这就是我所做的:

RS:

void rotate90CW(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
    // XY. ..X ... ... 
    // ...>..Y>...>Y..
    // ... ... .YX X.. 
    out[...]=in[...] ...
}

Java:

    mRenderScript = RenderScript.create(this);
    mInBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_photo);
    mOutBitmap = Bitmap.createBitmap(mInBitmap.getHeight(), mInBitmap.getWidth(), mInBitmap.getConfig());
    final Allocation input = Allocation.createFromBitmap(mRenderScript, mInBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    final Allocation output = Allocation.createFromBitmap(mRenderScript, mOutBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    ScriptC_test script = new ScriptC_test(mRenderScript, getResources(), R.raw.test);
    ...
    script.forEach_rotate90CW(input, output);
    output.copyTo(mOutBitmap);

即使我确实将两个分配设置为相同的大小(平方位图),并且我只是将输出设置为输入:

out[width * y + x] = in[width * y+x];
  • 然后我得到的是一个有洞的位图...怎么会这样?

这就是我得到的:

enter image description here

问题

  1. 这是否意味着我不能进行此类操作?

  2. 这是否意味着我无法使用各种大小/维度的分配?

  3. 是否有可能克服这个问题(当然仍然使用 Renderscript)?如果是这样,怎么办? 也许我可以在 RS 端添加一个数组变量,然后为其设置分配?

  4. 对于方形输入和输出,为什么位图中会出现洞?


编辑:这是我当前的代码:

RS

rs_allocation *in;  

uchar4 属性((内核))rotate90CW(uint32_t x, uint32_t y){ //XY。 ..X ... ... //...>..Y>...>Y.. //... ....YX X.. uchar4 curIn =rsGetElementAt_uchar4(in, 0, 0); 返回当前值;//仅用于测试... }

Java:

    mRenderScript = RenderScript.create(this);
    mInBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_photo);
    mOutBitmap = Bitmap.createBitmap(mInBitmap.getHeight(), mInBitmap.getWidth(), mInBitmap.getConfig());
    final Allocation input = Allocation.createFromBitmap(mRenderScript, mInBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    final Allocation output = Allocation.createFromBitmap(mRenderScript, mOutBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
    ScriptC_test script = new ScriptC_test(mRenderScript, getResources(), R.raw.test);

    script.bind_in(input);
    script.forEach_rotate90CW(output);
    output.copyTo(mOutBitmap);
    mImageView.setImageBitmap(mOutBitmap);

最佳答案

这里是:

  1. Does this mean I can't do this kind of operation?

不,不是真的。您只需要正确地制作东西即可。

  1. Does it mean that I can't use allocations of various sizes/dimensions?

不,但这确实意味着您不能以当前的方式使用不同的大小分配。默认的内核输入/输出机制期望输入和输出大小匹配,以便它可以正确地迭代所有元素。如果您需要不同的东西,则由您来管理。更多内容请参见下文。

  1. Is it possible to overcome this issues...how?

最简单的解决方案是为输入创建一个分配并将其绑定(bind)到渲染脚本实例,而不是将其作为参数传递。那么你的RS只需要一个输出分配(并且你的内核只需要输出x和y)。从那里您可以确定您想要的输入分配中的哪个坐标并将其直接放入输出位置:

int inX = ...;
int inY = ...;
uchar4 curIn = rsGetElementAt_uchar4(inAlloc, inX, inY);
*out = curIn;
  1. Why do I get holes in the bitmap, for the case of a square input&output?

这是因为您无法使用 x 和 y 参数来偏移输入和输出分配。这些输入/输出参数已经指向输入和输出中的正确(相同)位置。您所做的索引是不必要的,并且不受真正支持。每次调用内核时,都会调用分配中的 1 个元素位置。这就是为什么作为参数提供时输入和输出大小必须相同的原因。

关于android - 我可以将 Renderscript 上的输入和输出分配设置为不同的大小/维度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33056776/

相关文章:

Python 列表轮换

cocos2d-iphone - 在 Cocos2d 中用手指旋转 Sprite

android.support.v8无法解析

java - RenderScript 在 Android Lollipop 中停止工作

android - 将基于 Material 的对话框主题与 AppCompat 一起使用

android - 应用程序最小化时访问相机

CSS 旋转 2 个对象

android - Renderscript 模糊警告

java - 打包 MVP 层有什么最佳实践吗?

java - Android SSL HttpGet(无对等证书)错误或(连接被对等关闭)错误