在嵌入式 Linux 中使用 libjpeg 无法在带有 RGB888 的 LCD(黑色)上显示 JPEG

Failed to show JPEG on LCD (black) with RGB888 using libjpeg in Embedded Linux

提问人:wangt13 提问时间:5/3/2023 更新时间:5/3/2023 访问量:46

问:

我正在使用嵌入式 Linux 系统(kernel-5.10.24),其中有一个 LCD 显示屏。
现在我正在尝试使用 libjpeg 在 LCD 上显示 JPEG 图片。
我在互联网上找到了一个示例代码,并在我的系统中进行了尝试。
当我选择使用 RGB888 模式时,我发现显示屏显示一个黑色矩形。

这是获取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

液晶显示屏上出现了一个黑色矩形,不是我要显示的图片。

我尝试使用,显示屏上显示了 2 张图片。但是什么都没有显示。
由于对帧缓冲编程的了解有限,我认为RGB数据处理可能有问题。
由于显示器支持ARGB,所以我改用了,得到了同样的结果。
#define BITS_PER_PIXEL 1632col = 0x0F000000 | (buffer[0][i*3] << 16) | (buffer[0][i*3+1] << 8) | buffer[0][i*3+2];

在位模式下,代码有什么问题?
**我认为这个问题是关于,不应该关闭**
32programing

Linux 显示 帧缓冲 libjpeg

评论

0赞 Mark Setchell 5/3/2023
尝试只显示纯红色,甚至不读取 JPEG,看看你是否写在正确的位置。然后是绿色的......
0赞 Mark Setchell 5/3/2023
另外,请尝试col = 0xFF000000 | ...
0赞 wangt13 5/3/2023
谢谢马克,我可以成功地在LCD上显示JPEG。您可以将您的评论作为正确答案发布,我会投赞成票。col = 0xFF000000 | ...

答:

3赞 Mark Setchell 5/3/2023 #1

根据我的评论,我建议您尝试:

col = 0xFF000000 | (buffer[0][i*3] << 16) | (buffer[0][i*3+1] << 8) | buffer[0][i*3+2];

以确保您的图像是完全不透明的,而不是只有 15/255 不透明的0x0F000000。