您的位置:首页 > 编程语言 > Qt开发

Qt下的RGB24与QImage等的对等转换

2013-09-26 14:44 155 查看
收藏几个有用的网站内容,是关于RGB24的问题

unsigned int convertYUVtoRGB(int y, int u, int v) {
    int r,g,b;
 
    r = y + (int)(1.402f*v);
    g = y - (int)(0.344f*u +0.714f*v);
    b = y + (int)(1.772f*u);
 
    r = r>255? 255 : r<0 ? 0 : r;
    g = g>255? 255 : g<0 ? 0 : g;
    b = b>255? 255 : b<0 ? 0 : b;
    return 0xff000000 | (b<<16) | (g<<8) | r;
}
 
 
unsigned int * convertYUV420_NV21toRGB8888(unsigned char data[78080], int width, int height) {
    int size = width*height;
    int offset = size;
    unsigned int * pixels = new unsigned int[size];
    int u, v, y1, y2, y3, y4;
 
    // i percorre os Y and the final pixels
    // k percorre os pixles U e V
    for(int i=0, k=0; i < size; i+=2, k+=2) {
        y1 = data[i  ]&0xff;
        y2 = data[i+1]&0xff;
        y3 = data[width+i  ]&0xff;
        y4 = data[width+i+1]&0xff;
 
        u = data[offset+k  ]&0xff;
        v = data[offset+k+1]&0xff;
        u = u-128;
        v = v-128;
 
        pixels[i  ] = convertYUVtoRGB(y1, u, v);
        pixels[i+1] = convertYUVtoRGB(y2, u, v);
        pixels[width+i  ] = convertYUVtoRGB(y3, u, v);
        pixels[width+i+1] = convertYUVtoRGB(y4, u, v);
 
        if (i!=0 && (i+2)%width==0)
            i+=width;
    }
 
    return pixels;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    unsigned char * buffer;
    unsigned int * image = NULL;
    QPixmap pixmap;
    QImage img(352, 288, QImage::Format_ARGB32_Premultiplied);
    img.fill(QColor(Qt::white).rgb());
 
    ofstream outfile ("debug.txt",ofstream::binary);
    ifstream is;
    is.open ("sample00.yuv", ios::binary );
    //    is.seekg (0, ios::end);
    //    length = is.tellg();
    //    is.seekg (0, ios::beg);
    buffer = new unsigned char[101376];
    is.read((char * )buffer,101376);
    is.close();
    for(int x=0; x<101376; x++)
    {
        outfile.write((char*)buffer + x, 1);
    }
    outfile.close();
 
    /*
     for (int x = 0; x < 10; ++x) {
       for (int y = 0; y < 10; ++y) {
         img.setPixel(x, y, qRgb(0, 0, 0));
       }
     }
     */
 
 
    for(int i = 0; i < 101376; i++)
        qDebug() << buffer[i]<< endl;
 
    image = convertYUV420_NV21toRGB8888(buffer,352,288);
    QByteArray byteImage((const char *)image);
    pixmap.loadFromData(byteImage);
 
 
    QLabel myLabel;
    myLabel.setPixmap(pixmap);
    myLabel.setGeometry(20,100,320,122);
    myLabel.show();
 
    return a.exec();
}


还有一段例子:

/* pDistImage = new QImage(w, h, 32) */
void RGB2Image(char *srcBuf, int w, int h, QImage *pDistImage)
{
 int i;
 int r, g, b;
 QRgb *point;
 uchar *bit;
 i = 0;
 bit = (uchar *)(srcBuf);
 for(int y = 0; y < h; y ++){
    for ( int x = 0; x < w; x ++ ){
     /* Please attion the Littile-Edian and Big-Edian,
      * The Order maybe R-G-B.
      */
        b = (int)bit[i];
        g = (int)bit[i+1];
        r = (int)bit[i+2];
        point = (QRgb *)pDistImage->scanLine(y) + x;
        *point = qRgb(r, g, b);
        i += 3;
     }
 }
 return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: