[AssistantTool]_7_添加生成测试图的功能

该博客介绍了为嵌入式设备开发的颜色测试工具,用于检查输出原色是否正常。工具支持RGBA8888、RGB888和RGB565格式,提供多种图像生成功能,包括渐变色、随机数、单色渐变色、黑白条、棋盘格和彩色条等。通过绘制不同图像的函数实现,如testColor、testUrandom和checkerBoard等,生成的测试图保存原始数据到文件中供设备测试。
摘要由CSDN通过智能技术生成

[AssistantTool]_7_添加生成测试图的功能

创建时间:20200615 17:30:00

功能

  • 生成测试图,并保存对应原始数据到文件中,用来给嵌入式设备测试输出原色是否正常的问题

支持的格式

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bpJ3aC6T-1629641365376)(image/2020-06-15-17-45-45.png)]
    • RGBA8888
    • RGB888
    • RGB565

支持的图像

  • 渐变色

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Abc570si-1629641365377)(image/2020-06-15-17-31-36.png)]
  • 随机数

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KawpZ3di-1629641365378)(image/2020-06-15-17-32-19.png)]
  • 单色渐变色

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VfKLfAo1-1629641365379)(image/2020-06-15-17-31-11.png)]
  • 黑白条

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYFXb9Ih-1629641365380)(image/2020-06-15-17-33-01.png)]
  • 棋盘格

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OzrYeJ9h-1629641365381)(image/2020-06-15-17-33-15.png)]
  • 彩色条

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKuiHK3W-1629641365381)(image/2020-06-15-17-33-29.png)]
  • 纯色

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C73vUSTN-1629641365382)(image/2020-06-15-17-33-49.png)]

绘制图像核心函数


/*

 * 函数名称 : clearFrameBuff
 * 函数介绍 : 使用指定颜色刷新FrameBuffer
 * 参数介绍 : data:FrameBuffer相关信息, x,y,w,h:清空的矩形, r,g,b:使用的颜色,
 *           bps:framebuffer的bps
 * 返回值   : -1:失败,  0:成功
 */
int ColorTestForm::clearFrameBuff(char *indata, int x, int y, int w, int h, int r, int g, int b, int bps)
{
    unsigned int rgb = 0;
    int drawW = 0;
    int drawH = 0;
    int fbw = xres;
    int fbh = yres;


    if ( x + w > fbw )
    {
        drawW = fbw-x;
    }
    else
    {
        drawW = w;
    }

    if ( y + h > fbh )
    {
        drawH = fbh-y;
    }
    else
    {
        drawH = h;
    }

    switch( bps )
    {
        case 32:
            rgb = (b<<24) | (g<<16) | (r<<8);
        break;
        case 16:
            rgb = (((unsigned(r) << 8) & 0xF800) |
                    ((unsigned(g) << 3) & 0x7E0) |
                    ((unsigned(b) >> 3)));
        break;
    }


    for( int i = 0; i < drawH; i++ )
    {
        for( int j = 0; j < drawW; j++ )
        {
            switch( bps )
            {
                case 32:
                    indata[fbw*4*(i+y)+(j+x)*4] = (rgb>>24)&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+1] = (rgb>>16)&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+2] = (rgb>>8)&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+3] = a;
                break;
                case 24:
                    indata[fbw*3*(i+y)+(j+x)*3]   = b&0xFF;
                    indata[fbw*3*(i+y)+(j+x)*3+1] = g&0xFF;
                    indata[fbw*3*(i+y)+(j+x)*3+2] = r&0xFF;
                break;
                case 16:
                    indata[fbw*2*(i+y)+(j+x)*2] = (rgb)&0xFF;
                    indata[fbw*2*(i+y)+(j+x)*2+1] = (rgb>>8)&0xFF;
                break;
            }
        }
    }
    return 0;
}



/*
 * 函数名称 : testColor
 * 函数介绍 : 测试颜色FrameBuffer - 渐变色
 * 参数介绍 : data:FrameBuffer相关信息, x,y,w,h:清空的矩形,  br,bg,bb:使用的颜色,
 *           bps:framebuffer的bps
 * 返回值   : -1:失败,  0:成功
 */
int ColorTestForm::testColor(char * indata, int x, int y, int w, int h, int br, int bg, int bb, int bps)
{
    unsigned int rgb = 0;
    int drawW = 0;
    int drawH = 0;
    int fbw = xres;
    int fbh = yres;
    int r = br, g = bg, b = bb;
    int rgFlag = 0;

    if ( x + w > fbw )
    {
        drawW = fbw-x;
    }
    else
    {
        drawW = w;
    }


    if ( y + h > fbh )
    {
        drawH = fbh-y;
    }
    else
    {
        drawH = h;
    }

    for( int i = 0; i < drawH; i++ )
    {
        for( int j = 0; j < drawW; j++ )
        {
            r = (unsigned int)(br + (float)i/drawH*255)%255;
            g = (unsigned int)(bg + (float)j/drawW*255)%255;
            b = bb % 255;
            switch( bps )
            {
                case 32:
                    indata[fbw*4*(i+y)+(j+x)*4]   = b&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+1] = g&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+2] = r&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+3] = a;
                break;
                case 24:
                    indata[fbw*3*(i+y)+(j+x)*3]   = b&0xFF;
                    indata[fbw*3*(i+y)+(j+x)*3+1] = g&0xFF;
                    indata[fbw*3*(i+y)+(j+x)*3+2] = r&0xFF;
                break;
                case 16:
                    rgb = (((r << 8) & 0xF800) |
                        ((g << 3) & 0x7E0) |
                        ((b >> 3)));
                    indata[fbw*2*(i+y)+(j+x)*2] = (rgb)&0xFF;
                    indata[fbw*2*(i+y)+(j+x)*2+1] = (rgb>>8)&0xFF;
                break;
            }
        }
    }
    return 0;
}


/*
 * 函数名称 : testUrandom
 * 函数介绍 : 测试颜色FrameBuffer - 随机数
 * 参数介绍 : fbInfo:FrameBuffer相关信息, x,y,w,h:清空的矩形
 *           bps:framebuffer的bps
 * 返回值   : -1:失败,  0:成功
 */
int ColorTestForm::testUrandom(char *indata, int x, int y, int w, int h, int bps)
{
    unsigned int rgb = 0;
    int drawW = 0;
    int drawH = 0;
    int fbw = xres;
    int fbh = yres;
    int rgFlag = 0;
    int r = 0;
    int g = 0;
    int b = 0;
    int a = 0;

    if ( x + w > fbw )
    {
        drawW = fbw-x;
    }
    else
    {
        drawW = w;
    }

    if ( y + h > fbh )
    {
        drawH = fbh-y;
    }
    else
    {
        drawH = h;
    }

    for( int i = 0; i < drawH; i++ )
    {
        for( int j = 0; j < drawW; j++ )
        {
            r = rand()/255;
            g = rand()/255;
            b = rand()/255;
            a = rand()/255;
            switch( bps )
            {
                case 32:
                    indata[fbw*4*(i+y)+(j+x)*4]   = b&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+1] = g&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+2] = r&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+3] = a;

                break;
                case 16:
                    rgb = (((r << 8) & 0xF800) |
                        ((g << 3) & 0x7E0) |
                        ((b >> 3)));
                    indata[fbw*2*(i+y)+(j+x)*2] = (rgb)&0xFF;
                    indata[fbw*2*(i+y)+(j+x)*2+1] = (rgb>>8)&0xFF;
                break;
            }
        }
    }
    return 0;
}


/*
 * 函数名称 : testSolidColor
 * 函数介绍 : 测试单颜色FrameBuffer - 单色渐变色
 * 参数介绍 : fbInfo:FrameBuffer相关信息, x,y,w,h:清空的矩形,  br,bg,bb:使用的颜色,
 *           bps:framebuffer的bps
 * 返回值   : -1:失败,  0:成功
 */
int ColorTestForm::testSolidColor(char * indata, int x, int y, int w, int h, int br, int bg, int bb, int bps)
{
    unsigned int rgb = 0;
    int drawW = 0;
    int drawH = 0;
    int fbw = xres;
    int fbh = yres;
    int r = br, g = bg, b = bb;
    int rgFlag = 0;

    if ( x + w > fbw )
    {
        drawW = fbw-x;
    }
    else
    {
        drawW = w;
    }

    if ( y + h > fbh )
    {
        drawH = fbh-y;
    }
    else
    {
        drawH = h;
    }

    for( int i = 0; i < drawH; i++ )
    {
        r = br;
        g = bg;
        b = bb;
        for( int j = 0; j < drawW; j++ )
        {
            if ( i <= drawH/3 )
            {
                r = (unsigned int)(br + j*255/drawW)%255;
            }
            else if ( drawH/3 && i <= drawH*2/3 )
            {
                g = (unsigned int)(bg + j*255/drawW)%255;
            }
            else if ( drawH*2/3 < i )
            {
                b = (unsigned int)(bb + j*255/drawW)%255;
            }

            switch( bps )
            {
                case 32:
                    indata[fbw*4*(i+y)+(j+x)*4]   = b&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+1] = g&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+2] = r&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+3] = a;
                break;
                case 16:
                    rgb = (((r << 8) & 0xF800) |
                        ((g << 3) & 0x7E0) |
                        ((b >> 3)));
                    indata[fbw*2*(i+y)+(j+x)*2] = (rgb)&0xFF;
                    indata[fbw*2*(i+y)+(j+x)*2+1] = (rgb>>8)&0xFF;
                break;
            }
        }
    }
    return 0;
}


/*
 * 函数名称 : checkerBoard
 * 函数介绍 : 测试颜色FrameBuffer - 棋盘格
 * 参数介绍 : data:FrameBuffer相关信息, x,y,w,h:清空的矩形
 *           bps:framebuffer的bps
 * 返回值   : -1:失败,  0:成功
 */
int ColorTestForm::checkerBoard(char *indata, int x, int y, int w, int h, int bps)
{
    unsigned int rgb = 0;
    int drawW = 0;
    int drawH = 0;
    int fbw = xres;
    int fbh = yres;
    int r, g, b;
    int rgFlag = 0;

    if ( x + w > fbw )
    {
        drawW = fbw-x;
    }
    else
    {
        drawW = w;
    }

    if ( y + h > fbh )
    {
        drawH = fbh-y;
    }
    else
    {
        drawH = h;
    }


    for( int i = 0; i < drawH; i++ )
    {
        for( int j = 0; j < drawW; j++ )
        {
            r = (i/(drawH/10))*70%255;
            g = (j/(drawW/10))*40%255;
            b = (r+g)%255;

            switch( bps )
            {
                case 32:
                    indata[fbw*4*(i+y)+(j+x)*4]   = b&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+1] = g&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+2] = r&0xFF;
                    indata[fbw*4*(i+y)+(j+x)*4+3] = a;
                break;
                case 24:
                indata[fbw*3*(i+y)+(j+x)*3]   = b&0xFF;
                indata[fbw*3*(i+y)+(j+x)*3+1] = g&0xFF;
                indata[fbw*3*(i+y)+(j+x)*3+2] = r&0xFF;
                break;
                case 16:
                    rgb = (((r << 8) & 0xF800) |
                        ((g << 3) & 0x7E0) |
                        ((b >> 3)));

                    indata[fbw*2*(i+y)+(j+x)*2] = (rgb)&0xFF;
                    indata[fbw*2*(i+y)+(j+x)*2+1] = (rgb>>8)&0xFF;
                break;

            }

        }

    }

    return 0;

}

绘制不同图像

    if ( uc == 0 )
    {
        testColor(data, 0, 0, xres, yres, r, g, b, toBps(ui->comboBox_Format->currentText()));
    }
    else if(uc == 1)
    {
        float len = xres/8;
        clearFrameBuff(data, 0*len, 0, xres/8, yres,  0xff, 0xff, 0xff, toBps(ui->comboBox_Format->currentText()));
        clearFrameBuff(data, 1*len, 0, xres/8, yres,  0xb8, 0xc6, 0x00, toBps(ui->comboBox_Format->currentText()));
        clearFrameBuff(data, 2*len, 0, xres/8, yres,  0x00, 0xc2, 0xca, toBps(ui->comboBox_Format->currentText()));
        clearFrameBuff(data, 3*len, 0, xres/8, yres,  0x00, 0xc6, 0x00, toBps(ui->comboBox_Format->currentText()));
        clearFrameBuff(data, 4*len, 0, xres/8, yres,  0xc7, 0x00, 0xb9, toBps(ui->comboBox_Format->currentText()));
        clearFrameBuff(data, 5*len, 0, xres/8, yres,  0xc4, 0x00, 0x00, toBps(ui->comboBox_Format->currentText()));
        clearFrameBuff(data, 6*len, 0, xres/8, yres,  0x00, 0x00, 0xcb, toBps(ui->comboBox_Format->currentText()));
        clearFrameBuff(data, 7*len, 0, xres/8, yres,  0x00, 0x00, 0x00, toBps(ui->comboBox_Format->currentText()));
    }
    else if(uc == 2)
    {
        clearFrameBuff(data, 0, 0, xres, yres, ui->lineEdit_Red->text().toInt(), \
                       ui->lineEdit_Green->text().toInt(), ui->lineEdit_Blue->text().toInt(), \
                       toBps(ui->comboBox_Format->currentText()));
    }
    else if(uc == 3)
    {
        checkerBoard(data, 0, 0, xres, yres, toBps(ui->comboBox_Format->currentText()));
    }
    else if(uc == 4)
    {
        float len = xres/l_num;
        for( int i = 0; i < l_num; i++ )
        {
            if( i%2 == 0 )
            {
                clearFrameBuff(data, i*len, 0, xres/l_num, yres,  0xff, 0xff, 0xff, toBps(ui->comboBox_Format->currentText()));
            }
            else
            {
                clearFrameBuff(data, i*len, 0, xres/l_num, yres,  0x00, 0x00, 0x00, toBps(ui->comboBox_Format->currentText()));
            }
        }
    }
    else if(uc == 5)
    {
        testUrandom(data, 0, 0, xres, yres, toBps(ui->comboBox_Format->currentText()));
    }
    else if ( uc == 6 )
    {
        testSolidColor(data, 0, 0, xres, yres, r, g, b, toBps(ui->comboBox_Format->currentText()));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值