You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌入式Linux下libjpeg RGB888模式JPEG显示黑屏问题排查

32位FrameBuffer模式下LibJPEG显示JPEG黑屏问题

基于kernel-5.10.24的嵌入式Linux系统开发,系统搭载LCD显示屏。尝试使用libjpeg库在LCD上显示JPEG图片,参考网上示例代码后,发现选择RGB888模式时屏幕仅显示黑色矩形。

核心代码

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

切换#define BITS_PER_PIXEL为16时,屏幕可显示两张图片;改为32时则无内容显示。已知显示屏支持ARGB模式,尝试修改代码为col = 0x0F000000 | (buffer[0][i*3] << 16) | (buffer[0][i*3+1] << 8) | buffer[0][i*3+2];,但结果仍为黑屏。

请问32位模式下的代码存在什么问题?


内容的提问来源于stack exchange,提问作者wangt13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:37:04