我的问题是:我在Android中设置了一个摄像头并通过使用onPreviewFrame监听器接收预览数据,该监听器向我传递一个包含默认android YUV格式的图像数据的byte []数组(设备不支持R5G6B5-格式).每个像素由12位组成,这使得事情有点棘手.现在我想要做的是将YUV数据转换为ARGB数据,以便用它进行图像处理.这必须使用renderscript来完成,以保持高性能.
我的想法是在一个元素中传递两个像素(这将是24位= 3个字节),然后返回两个ARGB像素.问题是,在Renderscript中,u8_3(三维8位向量)存储在32位,这意味着最后8位未使用.但是当将图像数据复制到分配中时,使用了所有32位,因此最后8位丢失.即使我使用32位输入数据,最后8位也没用,因为它们只有2/3像素.在定义包含3字节数组的元素时,它实际上具有3个字节的实际大小.但是然后Allocation.copyFrom() - 方法没有用数据填充in-Allocation,认为它没有用byte []填充正确的数据类型.
renderscript文档指出,有一个ScriptIntrinsicYuvToRGB应该在API级别17中完全执行.但实际上该类不存在.我已经下载了API Level 17,即使它似乎不再可以下载了.有没有人有任何关于它的信息?有没有人尝试过ScriptIntrinsic?
总而言之,我的问题是:如何快速,快速地将摄像机数据转换为ARGB数据?
这是在Dalvik VM中如何做到这一点(在网上找到代码,它的工作原理):
@SuppressWarnings("unused")
private void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) …Run Code Online (Sandbox Code Playgroud)