ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RGB转YUV

2021-12-17 10:05:18  阅读:195  来源: 互联网

标签:int NSLog ++ YUV char width RGB rgba


YUV常见格式是以下四种,其他的格式自行搜索,以下是转换方法
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP

以下转换方法是RGBA的像素格式,如果是ARGB,RGB,BGR等,自行去转换,
或者调整方法;

I420: YYYYYYYY UU VV =>YUV420P转换方法

char rgba[] = {
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0
    };
    
    NSLog(@"===y===%d",(int)(0.299*1 + 0.587*2 + 0.114*3));
    NSLog(@"===u===%d",(int)(-0.1687*1 - 0.3313*2 + 0.5*3 + 128));
    NSLog(@"===v===%d",(int)(0.5*1 - 0.4187*2 - 0.0813*3 + 128));
    
    int height = 4;
    int width = 4;
    
    int frameSize = width * height;
    int yIndex = 0;
    int vIndex = frameSize;
    int uIndex = frameSize*1.25;

    unsigned char *yuv_Y = (unsigned char *)malloc(frameSize+frameSize/4+frameSize/4);
    
    
    int r, g, b, y, u, v, a;
    int index = 0;
    size_t offset,p;
    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {//RGBA
            
            offset = ((width * j) + i);
            p = offset*4;
            //
            r = rgba[p + 0];
            g = rgba[p + 1];
            b = rgba[p + 2];
            a = rgba[p + 3];
            
            //转换
            y = 0.299*r + 0.587*g + 0.114*b;
            u = -0.1687*r - 0.3313*g + 0.5*b + 128;
            v = 0.5*r - 0.4187*g - 0.0813*b + 128;
            
            yuv_Y[yIndex++] = y;
            if (j % 2 == 0 && i % 2 == 0) {//按2 * 2矩阵取
                yuv_Y[vIndex++] = u;
                yuv_Y[uIndex++] = v;
            }
            index ++;
        }
    }
    
    for (int i = 0; i<frameSize+frameSize/2; i++) {
        NSLog(@"===y===%d",yuv_Y[i]);
    }
    

I420: YYYYYYYY UU VV =>YUV420P转换方法(2)

char rgba[] = {
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0
    };
    
    NSLog(@"===y===%d",(int)(0.299*1 + 0.587*2 + 0.114*3));
    NSLog(@"===u===%d",(int)(-0.1687*1 - 0.3313*2 + 0.5*3 + 128));
    NSLog(@"===v===%d",(int)(0.5*1 - 0.4187*2 - 0.0813*3 + 128));
    
    int height = 4;
    int width = 4;
    
    int frameSize = width * height;
    int yIndex = 0;
    int vIndex = 0;
    int uIndex = 0;

    unsigned char *yuv_Y = (unsigned char *)malloc(frameSize);
    unsigned char *yuv_V = (unsigned char *)malloc(frameSize/4);
    unsigned char *yuv_U = (unsigned char *)malloc(frameSize/4);
    
    int r, g, b, y, u, v, a;
    int index = 0;
    size_t offset,p;
    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {//RGBA
            
            offset = ((width * j) + i);
            p = offset*4;
            //
            r = rgba[p + 0];
            g = rgba[p + 1];
            b = rgba[p + 2];
            a = rgba[p + 3];
            
            //转换
            y = 0.299*r + 0.587*g + 0.114*b;
            u = -0.1687*r - 0.3313*g + 0.5*b + 128;
            v = 0.5*r - 0.4187*g - 0.0813*b + 128;
            
            yuv_Y[yIndex++] = y;
            if (j % 2 == 0 && i % 2 == 0) {//按2 * 2矩阵取
                yuv_V[vIndex++] = v;
                yuv_U[uIndex++] = u;
            }
            index ++;
        }
    }
    
    for (int i = 0; i<frameSize; i++) {
        NSLog(@"===y===%d",yuv_Y[i]);
    }
    for (int i = 0; i<frameSize/4; i++) {
        NSLog(@"===v===%d",yuv_V[i]);
    }
    for (int i = 0; i<frameSize/4; i++) {
        NSLog(@"===u===%d",yuv_U[i]);
    }

YV12: YYYYYYYY VV UU =>YUV420P转换方法

char rgba[] = {
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0
    };
    
    NSLog(@"===y===%d",(int)(0.299*1 + 0.587*2 + 0.114*3));
    NSLog(@"===u===%d",(int)(-0.1687*1 - 0.3313*2 + 0.5*3 + 128));
    NSLog(@"===v===%d",(int)(0.5*1 - 0.4187*2 - 0.0813*3 + 128));
    
    int height = 4;
    int width = 4;
    
    int frameSize = width * height;
    int yIndex = 0;
    int vIndex = frameSize;
    int uIndex = frameSize * 1.25;

    unsigned char *yuv = (unsigned char *)malloc(frameSize + frameSize/4 + frameSize/4);
    
    int r, g, b, y, u, v, a;
    int index = 0;
    size_t offset,p;
    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {//RGBA
            
            offset = ((width * j) + i);
            p = offset*4;
            //
            r = rgba[p + 0];
            g = rgba[p + 1];
            b = rgba[p + 2];
            a = rgba[p + 3];
            
            //转换
            y = 0.299*r + 0.587*g + 0.114*b;
            u = -0.1687*r - 0.3313*g + 0.5*b + 128;
            v = 0.5*r - 0.4187*g - 0.0813*b + 128;
            
            yuv[yIndex++] = y;
            if (j % 2 == 0 && i % 2 == 0) {//按2 * 2矩阵取
                yuv[vIndex++] = v;
                yuv[uIndex++] = u;
            }
            index ++;
        }
    }
    
    for (int i = 0; i<frameSize + frameSize/2; i++) {
        NSLog(@"===y===%d",yuv[i]);
    }

NV21: YYYYYYYY VUVU =>YUV420SP转换方法

char rgba[] = {
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0
    };
    
    NSLog(@"===y===%d",(int)(0.299*1 + 0.587*2 + 0.114*3));
    NSLog(@"===u===%d",(int)(-0.1687*1 - 0.3313*2 + 0.5*3 + 128));
    NSLog(@"===v===%d",(int)(0.5*1 - 0.4187*2 - 0.0813*3 + 128));
    
    int height = 4;
    int width = 4;
    int wh = width * height;
    
    unsigned char *bufY = (unsigned char *)malloc(wh);
    unsigned char *bufUV = (unsigned char *)malloc(wh/2);

    size_t offset,p;

    int r,g,b,y,u,v;
    int a=255;
    for (int row = 0; row < height; ++row) {
      for (int col = 0; col < width; ++col) {
        //
        offset = ((width * row) + col);
        p = offset*4;
        //
        r = rgba[p + 0];
        g = rgba[p + 1];
        b = rgba[p + 2];
        a = rgba[p + 3];
        //
        y = 0.299*r + 0.587*g + 0.114*b;
        u = -0.1687*r - 0.3313*g + 0.5*b + 128;
        v = 0.5*r - 0.4187*g - 0.0813*b + 128;
        //
        bufY[offset] = y;
        bufUV[(row/2)*width + (col/2)*2] = v;
        bufUV[(row/2)*width + (col/2)*2 + 1] = u;
      }
    }
    
    for (int i = 0; i<wh; i++) {
        NSLog(@"===y===%d",bufY[i]);
    }
    
    for (int i = 0; i<wh/2; i++) {
        NSLog(@"===uv===%d",bufUV[i]);
    }

NV12: YYYYYYYY UVUV =>YUV420SP转换方法

char rgba[] = {
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,
        1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0
    };
    
    NSLog(@"===y===%d",(int)(0.299*1 + 0.587*2 + 0.114*3));
    NSLog(@"===u===%d",(int)(-0.1687*1 - 0.3313*2 + 0.5*3 + 128));
    NSLog(@"===v===%d",(int)(0.5*1 - 0.4187*2 - 0.0813*3 + 128));
    
    int height = 4;
    int width = 4;
    int wh = width * height;
    
    unsigned char *bufY = (unsigned char *)malloc(wh);
    unsigned char *bufUV = (unsigned char *)malloc(wh/2);

    size_t offset,p;

    int r,g,b,y,u,v;
    int a=255;
    for (int row = 0; row < height; ++row) {
      for (int col = 0; col < width; ++col) {
        //
        offset = ((width * row) + col);
        p = offset*4;
        //
        r = rgba[p + 0];
        g = rgba[p + 1];
        b = rgba[p + 2];
        a = rgba[p + 3];
        //
        y = 0.299*r + 0.587*g + 0.114*b;
        u = -0.1687*r - 0.3313*g + 0.5*b + 128;
        v = 0.5*r - 0.4187*g - 0.0813*b + 128;
        //
        bufY[offset] = y;
        bufUV[(row/2)*width + (col/2)*2] = u;
        bufUV[(row/2)*width + (col/2)*2 + 1] = v;
      }
    }
    
    for (int i = 0; i<wh; i++) {
        NSLog(@"===y===%d",bufY[i]);
    }
    for (int i = 0; i<wh/2; i++) {
        NSLog(@"===uv===%d",bufUV[i]);
    }
    

标签:int,NSLog,++,YUV,char,width,RGB,rgba
来源: https://blog.csdn.net/sinat_34245894/article/details/121989218

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有