[AssistantTool]_7_添加生成测试图的功能
创建时间:20200615 17:30:00
功能
- 生成测试图,并保存对应原始数据到文件中,用来给嵌入式设备测试输出原色是否正常的问题
支持的格式
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bpJ3aC6T-1629641365376)(image/2020-06-15-17-45-45.png)]
- RGBA8888
- RGB888
- RGB565
支持的图像
-
渐变色
-
随机数
-
单色渐变色
-
黑白条
-
棋盘格
-
彩色条
-
纯色
绘制图像核心函数
/*
* 函数名称 : 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()));
}