Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我可以将Renderscript上的输入和输出分配设置为不同的大小/维度吗? 背景_Android_Rotation_Renderscript - Fatal编程技术网

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

Android 我可以将Renderscript上的输入和输出分配设置为不同的大小/维度吗? 背景,android,rotation,renderscript,Android,Rotation,Renderscript,我正在学习Renderscript,所以我想尝试做一些我想做的简单操作 问题 我想到了旋转位图,这是一种非常简单的管理方法 在C/C++上,这是一件简单的事情(搜索“jniRotateBitmapCw90”): 问题是,当我在Renderscript上尝试此操作时,会出现以下错误: android.support.v8.renderscript.RSRuntimeException:维度不匹配 在参数ain和aout之间 我是这样做的: 卢比: 爪哇: 即使我将两个分配设置为相同大小(平方位图

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

问题 我想到了旋转位图,这是一种非常简单的管理方法

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

问题是,当我在Renderscript上尝试此操作时,会出现以下错误:

android.support.v8.renderscript.RSRuntimeException:维度不匹配 在参数ain和aout之间

我是这样做的:

卢比:

爪哇:

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

out[width * y + x] = in[width * y+x];
  • 然后我得到的是一个有孔的位图。。。为什么
这就是我得到的:

问题
  • 这是否意味着我不能做这种手术

  • 这是否意味着我不能使用各种大小/维度的分配

  • 有没有可能克服这个问题(当然,仍然使用Renderscript)?如果是,怎么做? 也许我可以在RS端添加一个数组变量,并将分配设置为它

  • 对于方形输入和输出,为什么位图中会有孔


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

    RS

    uchar4属性((内核))旋转90cw(uint32\u t x,uint32\u t y){ //XY…X。。。 //…>..Y>..>Y。。 //……YX。。 uchar4 curIn=rsGetElementAt_uchar4(in,0,0); 返回curIn;//仅用于测试。。。 }

    爪哇:

    下面是:

  • 这是否意味着我不能做这种手术
  • 不,不是真的。你只需要正确地制作东西

  • 这是否意味着我不能使用各种大小/维度的分配
  • 不,但这确实意味着您不能以当前的方式使用不同的大小分配。默认的内核输入/输出机制期望输入和输出大小匹配,以便能够正确地迭代所有元素。如果你需要一些不同的东西,这取决于你来管理它。下面将详细介绍

  • 有可能克服这些问题吗?如何克服
  • 最简单的解决方案是为输入创建分配并将其绑定到renderscript实例,而不是将其作为参数传递。然后您的RS将只需要一个输出分配(并且您的内核只接受输出x和y)。从那里,您可以确定需要输入分配中的哪个坐标,并将其直接放置到输出位置:

    int inX = ...;
    int inY = ...;
    uchar4 curIn = rsGetElementAt_uchar4(inAlloc, inX, inY);
    *out = curIn;
    
  • 对于方形输入和输出,为什么位图中会有孔

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

    这将解决您的问题

    RS

    rs\u分配*in;
    uchar4属性((内核))旋转90cw(uint32\u t x,uint32\u t y){
    ...
    uchar4 curIn=rsGetElementAt_uchar4(in,x,y);
    返回库林;
    }
    
    1。美好的2.所以它一个接一个地迭代每个分配元素,以便每个“in”匹配每个“out”?3.“inAlloc”应该如何声明和使用(在RS和Java中)?4.我没想到会以这种方式看到几乎正确的位图表示。古怪的正确的应该是*out=*in,然后呢?1.:-)2.对请注意,它也是并行执行的,因此您不能假定任何序列化顺序。3.查看“使用内存”部分下的内容。4.这有点怪,但很可能是因为同步。传入的对分配位置(in/out)的引用不打算像这样编制索引,因此这不是不可能的。如果你想做一个90度的移动,你就不能向外*向外=*向内,因为那只是一个副本。1+2+3。好的,谢谢。我读过,但还是不知道怎么做。它们与结构无关,但与数组/位图数据无关。您是否还知道有一个网页显示了我可以使用的所有可用RS功能的列表(如您使用的“rsGetElementAt…”)?4.最后一个例子是试图将输出设置为与输入相同,这就是为什么我写了“…我只是将输出设置为输入”。我想看看是否至少可以将输出设置为与输入类似。也许你是指“int32_t*intPointer”的部分?rsGetElementAt_uchar4似乎不存在:“错误:没有匹配函数用于调用'rsGetElementAt_uchar4'”。为什么呢?很遗憾,我不知道如何使用Renderscript了,尤其是在Android Studio上。
    out[width * y + x] = in[width * y+x];
    
    rs_allocation *in;  
    
        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);
    
    int inX = ...;
    int inY = ...;
    uchar4 curIn = rsGetElementAt_uchar4(inAlloc, inX, inY);
    *out = curIn;