找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3993|回复: 3
收起左侧

关于在嵌入式开发板上显示一张jpeg图片

[复制链接]
ID:410828 发表于 2019-4-22 11:03 | 显示全部楼层 |阅读模式
图片自己上传,还有图片名称,在代码也要跟着修改
0.png

单片机源程序如下:
  1. #include "lcdjpg.h"

  2. static char g_color_buf[FB_SIZE]={0};

  3. static int  g_fb_fd;
  4. static int *g_pfb_memory;

  5. /* video_chat.c 画中画显示的坐标 */
  6. volatile int g_jpg_in_jpg_x;
  7. volatile int g_jpg_in_jpg_y;



  8. /****************************************************
  9. *函数名称:file_size_get
  10. *输入参数:pfile_path        -文件路径
  11. *返 回 值:-1                -失败
  12.                    其他值        -文件大小
  13. *说        明:获取文件大小
  14. ****************************************************/
  15. unsigned long file_size_get(const char *pfile_path)
  16. {
  17.         unsigned long filesize = -1;       
  18.         struct stat statbuff;
  19.        
  20.         if(stat(pfile_path, &statbuff) < 0)
  21.         {
  22.                 return filesize;
  23.         }
  24.         else
  25.         {
  26.                 filesize = statbuff.st_size;
  27.         }
  28.        
  29.         return filesize;
  30. }

  31. unsigned char bcc_check(unsigned char *buf, int n)
  32. {
  33.     int i;
  34.     unsigned char bcc=0;
  35.        
  36.     for(i = 0; i < n; i++)
  37.     {
  38.         bcc ^= *(buf+i);
  39.     }
  40.        
  41.     return (~bcc);
  42. }


  43. //LCD画点
  44. void lcd_draw_point(unsigned int x,unsigned int y, unsigned int color)
  45. {
  46.         *(g_pfb_memory+y*800+x)=color;
  47. }


  48. int lcd_draw_jpg(unsigned int x,unsigned int y,const char *pjpg_path,char *pjpg_buf,unsigned int jpg_buf_size,unsigned int jpg_half)  
  49. {
  50.         //初始化LCD
  51.         g_fb_fd = open("/dev/fb0", O_RDWR);
  52.        
  53.         if(g_fb_fd<0)
  54.         {
  55.                         printf("open lcd error\n");
  56.                         return -1;
  57.         }

  58.         g_pfb_memory  = (int *)mmap(        NULL,                                         //映射区的开始地址,设置为NULL时表示由系统决定映射区的起始地址
  59.                                                                         FB_SIZE,                                 //映射区的长度
  60.                                                                         PROT_READ|PROT_WRITE,         //内容可以被读取和写入
  61.                                                                         MAP_SHARED,                                //共享内存
  62.                                                                         g_fb_fd,                                 //有效的文件描述词
  63.                                                                         0                                                //被映射对象内容的起点
  64.                                                                 );
  65.        
  66.         /*定义解码对象,错误处理对象*/
  67.         struct         jpeg_decompress_struct         cinfo;
  68.         struct         jpeg_error_mgr                         jerr;       
  69.        
  70.         char *pcolor_buf = g_color_buf;
  71.         char         *pjpg;
  72.        
  73.         unsigned int         i=0;
  74.         unsigned int        color =0;
  75.         unsigned int        count =0;
  76.        
  77.         unsigned int         x_s = x;
  78.         unsigned int         x_e ;       
  79.         unsigned int         y_e ;
  80.        
  81.                          int        jpg_fd;
  82.         unsigned int         jpg_size;
  83.        
  84.         unsigned int         jpg_width;
  85.         unsigned int         jpg_height;
  86.        

  87.         if(pjpg_path!=NULL)
  88.         {
  89.                 /* 申请jpg资源,权限可读可写 */       
  90.                 jpg_fd=open(pjpg_path,O_RDWR);
  91.                
  92.                 if(jpg_fd == -1)
  93.                 {
  94.                    printf("open %s error\n",pjpg_path);
  95.                   
  96.                    return -1;       
  97.                 }       
  98.                
  99.                 /* 获取jpg文件的大小 */
  100.                 jpg_size=file_size_get(pjpg_path);       

  101.                 /* 为jpg文件申请内存空间 */       
  102.                 pjpg = malloc(jpg_size);

  103.                 /* 读取jpg文件所有内容到内存 */               
  104.                 read(jpg_fd,pjpg,jpg_size);
  105.         }
  106.         else
  107.         {
  108.                 jpg_size = jpg_buf_size;
  109.                
  110.                 pjpg = pjpg_buf;
  111.         }

  112.         /*注册出错处理*/
  113.         cinfo.err = jpeg_std_error(&jerr);

  114.         /*创建解码*/
  115.         jpeg_create_decompress(&cinfo);

  116.         /*直接解码内存数据*/               
  117.         jpeg_mem_src(&cinfo,pjpg,jpg_size);
  118.        
  119.         /*读文件头*/
  120.         jpeg_read_header(&cinfo, TRUE);

  121.         /*开始解码*/
  122.         jpeg_start_decompress(&cinfo);       
  123.        
  124.        
  125.         if(jpg_half)
  126.         {
  127.                 x_e        = x_s+(cinfo.output_width/2);
  128.                 y_e        = y  +(cinfo.output_height/2);               
  129.                
  130.                 /*读解码数据*/
  131.                 while(cinfo.output_scanline < cinfo.output_height)
  132.                 {               
  133.                         pcolor_buf = g_color_buf;
  134.                        
  135.                         /* 读取jpg一行的rgb值 */
  136.                         jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);                       
  137.                        
  138.                         /* 再读取jpg一行的rgb值 */
  139.                         jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);

  140.                         for(i=0; i<(cinfo.output_width/2); i++)
  141.                         {
  142.                                 /* 获取rgb值 */
  143.                                 color =                 *(pcolor_buf+2);
  144.                                 color = color | *(pcolor_buf+1)<<8;
  145.                                 color = color | *(pcolor_buf)<<16;
  146.                                
  147.                                 /* 显示像素点 */
  148.                                 lcd_draw_point(x,y,color);
  149.                                
  150.                                 pcolor_buf +=6;
  151.                                
  152.                                 x++;
  153.                         }
  154.                        
  155.                         /* 换行 */
  156.                         y++;                                       
  157.                        
  158.                        
  159.                         x = x_s;       

  160.                        
  161.                 }
  162.         }
  163.         else
  164.         {
  165.                 x_e        = x_s+cinfo.output_width;
  166.                 y_e        = y  +cinfo.output_height;       

  167.                 /*读解码数据*/
  168.                 while(cinfo.output_scanline < cinfo.output_height )
  169.                 {               
  170.                         pcolor_buf = g_color_buf;
  171.                        
  172.                         /* 读取jpg一行的rgb值 */
  173.                         jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);
  174.                        
  175.                         for(i=0; i<cinfo.output_width; i++)
  176.                         {
  177.                                 /* 获取rgb值 */
  178.                                 color =                 *(pcolor_buf+2);
  179.                                 color = color | *(pcolor_buf+1)<<8;
  180.                                 color = color | *(pcolor_buf)<<16;
  181.                                
  182.                                 /* 显示像素点 */
  183.                                 lcd_draw_point(x,y,color);
  184.                                
  185.                                 pcolor_buf +=3;
  186.                                
  187.                                 x++;
  188.                         }
  189.                        
  190.                         /* 换行 */
  191. ……………………

  192. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
LED显示图片.zip (2.05 MB, 下载次数: 26)
回复

使用道具 举报

ID:499882 发表于 2020-7-28 11:33 | 显示全部楼层
可以再发一次吗?文件损坏了。
回复

使用道具 举报

ID:328014 发表于 2020-7-28 14:52 | 显示全部楼层
最新版的winrar可以解压
回复

使用道具 举报

ID:503899 发表于 2022-8-28 01:46 | 显示全部楼层
说明不够详细
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表