首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将NV12 yuv转换为RGB

将NV12 yuv转换为RGB
EN

Stack Overflow用户
提问于 2017-04-26 18:39:23
回答 1查看 2.2K关注 1票数 3

我编写了下面的代码来将NV12 yuv转换为RGB,但是颜色不正确。yuv2rgb.rs

代码语言:javascript
代码运行次数:0
运行
复制
#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代码:

代码语言:javascript
代码运行次数:0
运行
复制
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)。听起来这逻辑是错的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-26 18:57:42

需要修复两个错误:

  1. -1应该是~1,因为x& -1等于x,但是x&1会掩盖最后一个位,使值保持均匀。
  2. yuv矩阵大小不正确。由于uv矢量存储在y数据的末尾,所以矩阵的总大小应该是W*H*3/2。

在应用这两个更改之后,它工作得很好。java:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
#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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43642111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档