我在一个嵌入式Linux系统(内核-5.10.24)上工作,里面有一个LCD显示器。
现在我尝试使用libjpeg在LCD上显示JPEG图片。
我在互联网上找到了一个示例代码,并在我的系统中试用了它。
当我选择使用RGB 888模式时,我发现显示器显示一个黑色矩形。
下面是获取RGB数据并将其放入帧缓冲存储器的主要代码。
typedef unsigned int color_t;
///typedef unsigned short color_t;
#define BITS_PER_PIXEL 32
///#define BITS_PER_PIXEL 16
static struct fb_var_screeninfo __g_vinfo;
static color_t *__gp_frame = NULL;
.....
ioctl(fd, FBIOGET_VSCREENINFO, &__g_vinfo);
printf("bits_per_pixel = %d\n", __g_vinfo.bits_per_pixel);
printf("xres_virtual = %d\n", __g_vinfo.xres_virtual);
printf("yres_virtual = %d\n", __g_vinfo.yres_virtual);
printf("xres = %d\n", __g_vinfo.xres);
printf("yres = %d\n", __g_vinfo.yres);
__gp_frame = mmap(NULL, __g_vinfo.xres_virtual * __g_vinfo.yres_virtual *
__g_vinfo.bits_per_pixel / 8, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
......
......
int drawjpg(unsigned int x, unsigned int y, const char *name)
{
color_t col;
row_stride = cinfo.output_width * cinfo.output_components;
printf("width = %d\n", cinfo.output_width);
printf("height = %d\n", cinfo.output_height);
buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
while (cinfo.output_scanline < cinfo.output_height)
{
jpeg_read_scanlines(&cinfo, buffer, 1);
line = cinfo.output_scanline - 1 + y;
for(i = 0; i < cinfo.output_width; i++) {
#if (BITS_PER_PIXEL == 16)
char b, g, r;
r = (buffer[0][i*3] >> 3);
g = ((buffer[0][i*3+1] >> 2));
b = (buffer[0][i*3+2] >> 3);
col = (r << 11) | (g << 5) | b;
#elif (BITS_PER_PIXEL == 32)
col = (buffer[0][i*3] << 16) | (buffer[0][i*3+1] << 8) | buffer[0][i*3+2];
#endif
*(__gp_frame + line * __g_vinfo.xres + i + x) = col;
}
if (line >= __g_vinfo.yres) {
break;
}
}
.....
}
这是我在系统中运行它时得到的结果。
bits_per_pixel = 32
xres_virtual = 720
yres_virtual = 3840
xres = 720
yres = 1280
cinfo.image_width = 442
cinfo.image_height = 442
cinfo.jpeg_color_space = 3
cinfo.num_components = 3
-------------
width = 442
height = 442
LCD显示屏上出现了一个黑色的矩形,而不是我想要显示的图片。
我尝试使用#define BITS_PER_PIXEL 16
,显示器中显示了2张图片。但是对于32
,没有显示任何内容。
由于对帧缓冲区编程的了解有限,我认为RGB数据处理可能有问题。
由于显示器支持ARGB,所以我改为使用col = 0x0F000000 | (buffer[0][i*3] << 16) | (buffer[0][i*3+1] << 8) | buffer[0][i*3+2];
,并得到相同的结果。
在32
位模式下,代码有什么问题?
我认为这个问题是关于programing
的,不应该关闭
1条答案
按热度按时间oymdgrw71#
根据我的评论,我建议你试试:
以确保您的图像是完全不透明的,而不是0x 0 F000000,它只有15/255不透明。