android-Renderscript将NV12 yuv转换为RGB [英] android - Renderscript to convert NV12 yuv to RGB
本文介绍了android-Renderscript将NV12 yuv转换为RGB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在下面编写了将NV12 yuv转换为RGB的代码,但是颜色不正确.yuv2rgb.rs
I write below code to convert NV12 yuv to RGB but the color is not correct. yuv2rgb.rs
#pragma version(1)
#pragma rs java_package_name(com.example.myexam)
#pragma rs_fp_relaxed
rs_allocation gYUV;
uint32_t gW;
uint32_t gH;
uchar4 __attribute__((kernel)) YUV2RGB(uint32_t x,uint32_t y)
{
uchar yps = rsGetElementAt_uchar(gYUV, x, y);
uchar u = rsGetElementAt_uchar(gYUV,(x & ~1),gH + (y>>1));
uchar v = rsGetElementAt_uchar(gYUV,(x & ~1)+1,gH + (y>>1));
uchar4 rgb = rsYuvToRGBA_uchar4(yps, u, v);
return rgb;
}
java代码:
public Bitmap NV12_toRGB(byte[] yuv,int W,int H) {
RenderScript rs = RenderScript.create(this);
Type.Builder yuvBlder = new Type.Builder(rs, Element.U8(rs))
.setX(W).setY(H*3/2);
Allocation allocIn = Allocation.createTyped(rs,yuvBlder.create(),Allocation.USAGE_SCRIPT);
Type rgbType = Type.createXY(rs, Element.RGBA_8888(rs), W, H);
Allocation allocOut = Allocation.createTyped(rs,rgbType,Allocation.USAGE_SCRIPT);
ScriptC_yuv2rgb scriptC_yuv2rgb = new ScriptC_yuv2rgb(rs);
scriptC_yuv2rgb.set_gW(W);
scriptC_yuv2rgb.set_gH(H);
allocIn.copyFrom(yuv);
scriptC_yuv2rgb.set_gYUV(allocIn);
scriptC_yuv2rgb.forEach_YUV2RGB(allocOut);
Bitmap bmp = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);
allocOut.copyTo(bmp);
allocIn.destroy();
scriptC_yuv2rgb.destroy();
return bmp;
}
我猜想(x,y)是矩阵坐标,所以y应该在(x,y)处,u应该在((x/2)* 2,H + y/2),v应该是在u旁边,((x/2)* 2 + 1,H + y/2).听起来这种逻辑是错误的!
I guess the (x,y) is the matrix coordinate, so y should be at (x,y), u should be at ((x/2)*2,H + y/2),v should be next to u, ((x/2)*2+1,H + y/2). Sounds like this logic is wrong!
推荐答案
需要修复两个错误:
- -1应该为〜1,因为x&-1等于x,但x&〜1将掩盖最后一位,因此请保持该值均匀.
- yuv矩阵大小不正确.由于uv向量存储在y数据的末尾,因此总矩阵大小应为W * H * 3/2.
应用这两个更改后,它可以正常工作.java:
After apply these two changes, it works fine. java:
public Bitmap YUV_toRGB(byte[] yuv,int W,int H) {
RenderScript rs = RenderScript.create(this);
Type.Builder yuvBlder = new Type.Builder(rs, Element.U8(rs))
.setX(W).setY(H*3/2);
Allocation allocIn = Allocation.createTyped(rs,yuvBlder.create(),Allocation.USAGE_SCRIPT);
Type rgbType = Type.createXY(rs, Element.RGBA_8888(rs), W, H);
Allocation allocOut = Allocation.createTyped(rs,rgbType,Allocation.USAGE_SCRIPT);
ScriptC_yuv2rgb scriptC_yuv2rgb = new ScriptC_yuv2rgb(rs);
allocIn.copyFrom(yuv);
scriptC_yuv2rgb.set_gW(W);
scriptC_yuv2rgb.set_gH(H);
scriptC_yuv2rgb.set_gYUV(allocIn);
scriptC_yuv2rgb.forEach_YUV2RGB(allocOut);
Bitmap bmp = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);
allocOut.copyTo(bmp);
allocIn.destroy();
scriptC_yuv2rgb.destroy();
return bmp;
}
yuv2rgb.rs
yuv2rgb.rs
#pragma version(1)
#pragma rs java_package_name(com.example.myexam)
#pragma rs_fp_relaxed
rs_allocation gYUV;
uint32_t gW;
uint32_t gH;
uchar4 __attribute__((kernel)) YUV2RGB(uint32_t x,uint32_t y)
{
uchar yps = rsGetElementAt_uchar(gYUV, x, y);
uchar u = rsGetElementAt_uchar(gYUV,(x & ~1),gH + (y>>1));
uchar v = rsGetElementAt_uchar(gYUV,(x & ~1)+1,gH + (y>>1));
uchar4 rgb = rsYuvToRGBA_uchar4(yps, u, v);
return rgb;
}
这篇关于android-Renderscript将NV12 yuv转换为RGB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文