- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在接收 ARGB8888 格式的位图,但我需要通过某种只接受 RGB565 的算法对其进行处理。我想使用 Renderscript 将此位图转换为新格式,但似乎输入分配和输出分配应该相等(或兼容)。bitmapIn是ARGB_8888类型,bitmapOut是RGB_565类型
Caused by: android.renderscript.RSIllegalArgumentException: Allocation kind is PIXEL_RGBA, type UNSIGNED_8 of 4 bytes, passed bitmap was RGB_565
java :
public void convert(final Bitmap bitmapIn, Bitmap bitmapOut)
{
mInAllocation = Allocation.createFromBitmap(mRS, bitmapIn, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
Type.Builder tb = new Type.Builder(mRS, Element.RGB_565(mRS)).setX(bitmapIn.getWidth()).setY(bitmapOut.getWidth());
mOutAllocation = Allocation.createTyped(mRS, tb.create());
// Call custom method (not forEach_root) so we can have uchar4 in and uchar3 out
mScript.forEach_convert(mInAllocation, mOutAllocation);
mOutAllocation.copyTo(bitmapOut);
}
渲染脚本:
// Convert to RGB565 by quantizing the individual channels
void convert(const uchar4* v_in, uchar3* v_out)
{
v_out->x = v_in->x >> 3;
v_out->y = v_in->y >> 2;
v_out->z = v_in->z >> 3;
}
请注意,如果我制作了两个位图 ARGB_8888 并且让 convert() 在两个 uchar4* 上工作(并且只复制 alpha (w) channel ,那么我会看到位图被改变了。
我知道 565 等于 16 位,所以实际上它更可能是 uchar2,但它也与类型分配不兼容。
如何在 Renderscript 中进行这种类型转换?
最佳答案
我找不到用于 RGB565 图像的正确 Renderscript 类型,但 uint16_t 有效(至少在 Nexus S 上)。正如 Tim Murray 的回答,您必须分别绑定(bind)输入或输出分配。
这是执行转换的 Renderscript,其中输入 RGB8888 分配单独绑定(bind),rsForEach 在 RGB565 分配上调用:
#pragma version(1)
#pragma rs java_package_name(uk.co.massycat.renderscriptfun.rsfun)
rs_allocation gInImage;
void root(const uint16_t *v_in, uint16_t *v_out, const void *usrData, uint32_t x, uint32_t y) {
uint16_t colour = 0;
const uchar4 *in_pixel = rsGetElementAt(gInImage, x, y);
uint32_t red = in_pixel->r;
uint32_t green = in_pixel->g;
uint32_t blue = in_pixel->b;
red >>= 3;
green >>= 2;
blue >>= 3;
// red (5 bits)
colour |= red << 11;
// green (6 bits)
colour |= green << 5;
// blue (5 bits)
colour |= blue << 0;
#if 0
// red (5 bits)
colour |= 0x0 << 11;
// green (6 bits)
colour |= 0x0 << 5;
// blue (5 bits)
colour |= 0x1f << 0;
#endif
*v_out = colour;
}
void doWork( rs_script script, rs_allocation alloc_out) {
rsForEach(script, alloc_out, alloc_out);
}
在 RGB565 分配上调用 rsForEach 时,在 Java 端,您必须调用 invoke_doWork 脚本对象方法而不是 forEach_root 脚本对象方法,因为 forEach_root 调用将对 RGB565 分配进行类型检查并抛出异常说明它与 U16 不兼容。
Java 方面:
mInImageAllocation = Allocation.createFromBitmap(mRS, mInBitmap,
Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
Type.Builder tb = new Type.Builder(mRS, Element.RGB_565(mRS)).setX(mInBitmap.getWidth()).setY(mInBitmap.getHeight());
mOutAllocation = Allocation.createTyped(mRS, tb.create());
mScript.set_gInImage(mInImageAllocation);
mScript.invoke_doWork(mScript, mOutAllocation);
Bitmap tmp_bitmap = Bitmap.createBitmap(mInBitmap.getWidth(), mInBitmap.getHeight(), Bitmap.Config.RGB_565);
mOutAllocation.copyTo(tmp_bitmap);
mAnImageView.setImageBitmap(tmp_bitmap);
mAnImageView.invalidate();
关于android - 从 ARGB8888 到 RGB565 的 Renderscript 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15795751/
OpenCL doesn't support recursion . CUDA does, but only from a certain version .初始搜索表明 RenderScript 确
是否可以使用 RenderScript 拍摄 Y'UV 格式的相机图像: 将其转换为 RGBA 裁剪到特定区域 必要时旋转它 最佳答案 是的!我想出了如何并认为我会与他人分享。 RenderScrip
我希望从我的 renderscript 内核返回一个结构数组。我的问题是,虽然我可以使用生成的代码在 java 中创建一个结构数组,并通过获取由此生成的数组的分配将其传递给我的根方法,但我无法将数组返
我似乎找不到任何关于如何检查 RenderScript 是否真正并行化代码的文档。我想知道是否正在使用 CPU 或 GPU 以及调度的线程数。 我唯一发现的是这个错误报告: http://code.g
我想用 renderscript 做一些实验,所以我从 sdk 附带的示例开始,但不幸的是我无法编译它。是否有任何我可能需要的额外工具来编译和构建该示例,我曾尝试阅读文档。但他们什么也没提到。 示例项
使用 gradle:3.3.0-alpha06 更新到 Android Studio 3.3 Canary 6 后,我开始收到错误 Cannot find file sdk\build-tools\2
我编写了以下渲染脚本: ushort* curve_hth; ushort* curve_hts; ushort* curve_htv; ushort* curve_sth; ushort* curv
我开始探索 renderscript 的强大功能。 尝试使用 2D 图像数据,我可以将像素转换为其他像素。但是,如何从输入分配中获取相邻像素? 我想知道例如内置的 convolve3x3 过滤器是如何
renderscript 做矩阵计算很强大,但是如果我想处理当前帧和前一帧之间的差异。 正确的做法是什么: 在 renderscript 中保存前一帧,然后在新帧进来后进行计算。 在 java 中保存
如何在调用 rsgDrawText 之前设置字体特性?我对能够设置字体大小特别感兴趣。 最佳答案 这是一个多部分的过程。在用于控制 RenderScript 运行时(通常拥有脚本的文件)的文件中,在初
我想知道是否可以使用 RenderScript 引擎来优化算法。 该算法对图像进行迭代处理,直到满足某些条件。在处理所需的迭代次数之前无法知道。但我只看到 RenderScript 示例在具有 N 个
我注意到我实际上可以对 ScriptIntrinsicBlur 的输入和输出使用相同的分配。 .由于我对未过滤的分配不感兴趣,因此这种方法不需要创建另一个分配并且在内存方面更好。 但是,它安全吗?我在
我可以在适用于 android 2.2 及更高版本的应用程序中使用 renderscript 吗?因为我知道它已被用于墙纸,但仅限于内部。那改变了吗,因为 renderscript 现在是公开的?我正
我找到了这个 link我想试试轮播的例子。我将所有类和 rs 文件(轮播示例中的所有内容)复制到我自己的项目中,并尝试在实际设备(摩托罗拉 xoom)上构建它。但我一直在强制关闭。 logcat 中的
是否可以在 RenderScript for Android 中使用二维数组?分配只允许我将一个向量(一维)数组放入分配中。但我不知道如何生成二维数组。我 found a google groups
我正在编写一小段 Renderscript 来动态拍摄图像并根据每个像素的 RGB 值将像素分类到“桶”中。桶的数量可能会有所不同,所以我的直觉是创建一个数组列表。显然,这在 Renderscript
我想更好地了解内存分配在 Renderscript 中的工作原理。 首先,我想确认内存是在运行时还是编译时分配的。 文档指出: Non-static, global variables that yo
为了对齐两个灰度图像的强度值(作为进一步处理的第一步),我编写了一个 Java 方法: 将两个图像的位图转换为两个包含位图强度的 int[] 数组(我在这里只取红色分量,因为它是灰度,即 r=g=b
无法理解,因为当我尝试将 Allocation 用作输入和输出时,程序崩溃了。 我已经检查过是否由于 android list 中的某种类型的权限,但都没有。 project.properties如下
我正在编写渲染脚本代码,我需要一些实用函数。但是当我编写这些函数并进行编译时,我收到一条错误消息,指出可调用函数必须返回 void。他们正在强制执行此操作,以便所有渲染脚本可调用函数都可以异步运行。但
我是一名优秀的程序员,十分优秀!