首页 > 其他分享 >lcd屏幕显示jpeg图片,其中lcd每个像素占据4字节

lcd屏幕显示jpeg图片,其中lcd每个像素占据4字节

时间:2024-08-20 11:04:09浏览次数:10  
标签:int data cinfo lcd jpeg file 屏幕显示

// 编译
// arm-openwrt-linux-muslgnueabi-gcc -o 17_safe_lcd_camera_test ./jpeg_show.c    -L./lib/ -ljpeg -I./include/


#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h>
#include <setjmp.h>
#include <stdint.h>
#include <string.h>

// 错误处理结构体
struct my_error_mgr {
    struct jpeg_error_mgr pub;  // "public" fields
    jmp_buf setjmp_buffer;      // For return to caller
};
// 错误处理函数
void my_error_exit(j_common_ptr cinfo) {
    struct my_error_mgr * myerr = (struct my_error_mgr *)cinfo->err;
    longjmp(myerr->setjmp_buffer, 1);
}
// 解析 JPEG 数据并转换为 BGRA 格式 // width height 为屏幕宽度和高度
int decode_jpeg_to_bgra(uint8_t* jpeg_data, size_t jpeg_size, int width, int height, unsigned char* bgra_data) {
    struct jpeg_decompress_struct cinfo;
    struct my_error_mgr jerr;
    JSAMPARRAY buffer;
    int row_stride;

    // 设置错误处理
    cinfo.err = jpeg_std_error(&jerr.pub);
    jerr.pub.error_exit = my_error_exit;
    if (setjmp(jerr.setjmp_buffer)) {
        jpeg_destroy_decompress(&cinfo);
        return -1;
    }

    // 初始化解压缩对象
    jpeg_create_decompress(&cinfo);

    // 指定输入数据
    jpeg_mem_src(&cinfo, jpeg_data, jpeg_size);

    // 读取 JPEG 文件头
    jpeg_read_header(&cinfo, TRUE);

    // 开始解压缩
    jpeg_start_decompress(&cinfo);

    row_stride = cinfo.output_width * cinfo.output_components;



    // 处理每一行数据
    buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
    for (int row = 0; row < cinfo.output_height; row++) {
        jpeg_read_scanlines(&cinfo, buffer, 1);

        for (int col = 0; col < cinfo.output_width; col++) {
            uint8_t r = buffer[0][col * cinfo.output_components + 0];
            uint8_t g = buffer[0][col * cinfo.output_components + 1];
            uint8_t b = buffer[0][col * cinfo.output_components + 2];
            uint8_t a = 255; // Alpha channel, set to 255 (opaque)

            int offset = (row * width + col) * 4;
            bgra_data[offset + 0] = b;
            bgra_data[offset + 1] = g;
            bgra_data[offset + 2] = r;
            bgra_data[offset + 3] = a;
        }
    }

    // 完成解压缩
    jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);

    return 0;
}


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/fb.h>



unsigned char* lcd_init(int* w,int* h,int* bits_per_pixel)
{
    static unsigned char *lcd_mem_p = NULL; //保存LCD屏映射到进程空间的首地址
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;

    // "/dev/fb0";
    int lcd_fd = open("/dev/fb0", O_RDWR, 0);

    /*2. 获取可变参数*/
    if (ioctl(lcd_fd, FBIOGET_VSCREENINFO, &vinfo)){return -2;}
    printf("屏幕X:%d   屏幕Y:%d  像素位数:%d\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
    *w=vinfo.xres;
    *h=vinfo.yres;
    *bits_per_pixel=vinfo.bits_per_pixel;
    
    /*3. 获取固定参数*/
    if (ioctl(lcd_fd, FBIOGET_FSCREENINFO, &finfo)){return -3;}
    printf("smem_len=%d Byte,line_length=%d Byte\n", finfo.smem_len, finfo.line_length);

    /*4. 映射LCD屏物理地址到进程空间*/
    lcd_mem_p = (unsigned char *)mmap(0, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0); //从文件的那个地方开始映射
    memset(lcd_mem_p, 0xFFFFFF, finfo.smem_len);//白屏
    printf("映射LCD屏物理地址到进程空间\n");
    return lcd_mem_p;
}

int main(int argc, char **argv) {

    printf("usage:\n\t%s xxx.jpg\n\n",argv[0]);

    FILE *jpeg_file;
    if(argc==2){
        // strcpy(dev_video,argv[1]);
        jpeg_file = fopen(argv[1], "rb");
        printf(argv[1]);
        printf("\n");
    }
    else{
        jpeg_file = fopen("/mnt/UDISK/mjpeg_4.jpg", "rb");
    }
    


    // jpeg_file = fopen("/mnt/UDISK/mjpeg_4.jpg", "rb");
    if (!jpeg_file) {
        perror("Failed to open file");
        return 1;
    }

    int screen_w=0;//屏幕宽度
    int screen_h=0;//屏幕高度
    int screen_bits=0;//屏幕每个像素占据多少个bit位
    unsigned char* bgra_data=lcd_init(&screen_w,&screen_h,&screen_bits);
    

    // 获取文件大小
    fseek(jpeg_file, 0, SEEK_END);
    long file_size = ftell(jpeg_file);
    fseek(jpeg_file, 0, SEEK_SET);

    // 读取 JPEG 数据
    uint8_t *jpeg_data = (uint8_t*)malloc(file_size);
    if (!jpeg_data) {
        perror("Failed to allocate memory");
        fclose(jpeg_file);
        return 1;
    }
    fread(jpeg_data, 1, file_size, jpeg_file);
    fclose(jpeg_file);

    decode_jpeg_to_bgra(jpeg_data, file_size, screen_w, screen_h,bgra_data);
    free(jpeg_data);

    return 0;
}

 

 

 

//

标签:int,data,cinfo,lcd,jpeg,file,屏幕显示
From: https://www.cnblogs.com/RYSBlog/p/18369067

相关文章

  • 51单片机之LCD1602调试工具
    一、LCD1602介绍使用LCD1602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。LCD1602是一种能够同时显示16x02(2行16列)即32个字符的液晶显示屏,也被称为1602字符型液晶。本篇文章提供的LCD1602代码属于模块化的代码,使用者只需......
  • 为OpenCV1.0添加cvJpeg2Ipl函数
    由于在OpenCV1.0中只提供了从硬盘打开JPEG图像进行解码,有些时候如果JPEG的图像数据是从内存载入的,就无法使用这些曾经很方便高效的接口。为了实现这个目的,我们通过修改OpenCV1.0源码,在其源码包中添加函数,实现把jpeg数据从内存复制到IplImage结构中,这为我们进行相应处理会方......
  • lvds屏幕显示旋转180度
    参考:Linux-drm-display_sys-设备树及其启动流程_linuxdrm子系统-CSDN博客  在Linux系统中,‌/sys/class/drm/目录下的显示设备类型是通过DRM(‌DirectRenderingManager)‌的component框架生成的。‌DRM的component框架引入了component标识符和component关系的概念,‌使得内......
  • 在线仿真平台+C语言实现:STM32驱动0.96寸OLED屏幕显示DHT11温湿度传感器测量值
    这里推荐一款由深圳航天科技创新研究院推出的在线电路仿真软件,该软件不仅具备原理图绘制与代码编写功能,还支持在线编译代码、上传自定义代码以及进行仿真模拟,此外还能在线生成并允许下载.bin和.hex文件。官网地址如下:Document进入网页后先注册一个账号。  注册完账号后即可......
  • 【ESP01开发实例】-ESP-01驱动LCD1602 I2C
    ESP-01驱动LCD1602I2C文章目录ESP-01驱动LCD1602I2C1、LCD1602介绍2、硬件准备与接线3、代码实现ESP8266ESP-01模块只有8个引脚,其中4个可用作I/O(输入/输出)引脚(GPIO0、GPIO2、RX和TX),这个I/O引脚数量不足以运行16个引脚。×2LCD屏,至少需要......
  • 基于STM32-OLED多级菜单(LCD等等屏幕均可移植)
    一,内容概括:不使用长篇大论1:多级菜单介绍2:实现思路3:代码编写4:总结二,正文1.多级菜单介绍:想必大家看到这里,也知道多级菜单大概是什么;对于还不太清楚的朋友说明以下,多级菜单就是将一块屏幕原本只能显示一种内容,扩展到可以显示很多内容。依据自己的设定显示内容。2.实现思路......
  • FPGA MIPI DSI LCD彩条显示
    1MIPI简介MIPI(MobileIndustryProcessorInterface)是一种针对移动设备和嵌入式系统的接口标准,由MIPI联盟制定。其主要目的是提高移动设备之间的通信效率,降低功耗,并支持高速数据传输。MIPI的主要标准包括:MIPIDSI(DisplaySerialInterface):用于连接显示模块,支持高清视......
  • 911、基于51单片机的温度报警(上下限,LCD)
    完整资料或代做滴滴我(有偿)目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能温度报警系统1、实时显示当前温度2、对上下限进行设定,通过按键设置3、温度高于上限或低于下限显示屏有相应提示,蜂鸣器响二、proteus仿真三......
  • 【嵌入式DIY实例-ESP8266篇】- LCD ST7789显示BME280传感器数据
    LCDST7789显示BME280传感器数据文章目录LCDST7789显示BME280传感器数据1、硬件准备2、代码实现本文将介绍如何使用ESP8266NodeMCU开发板(ESP12-E模块)和BME280气压、温度和湿度传感器构建一个简单的气象站。NodeMCU微控制器(ESP8266EX)从BME280......
  • 为什么我似乎无法通过编程证明从 jpeg 创建的 png 对于任何给定像素都是相同的?
    因此png是无损的-这意味着它们以某种方式压缩,因此它们代表的数据不会丢失。因此,假设颜色深度和yaddayadda相同,从jpeg创建的png应该是像素相同的。果然,这很容易证明,只需打开Krita或GIMP,然后在像素级别手动检查jpeg与从jpeg创建的png,读取相同任意像素的单独RGB......