JZ2240最简单方式显示一张BMP图像

实现框架

    1.打开LCD设备

    2.打开BMP图片

    3.偏移54个字节

    4. 24位的bmp图像转化为S3C2440下4.3寸显示屏每位像素用16位表示的图片(注意:某些LCD 1个像素用32位表示)

    5.读取BMP图片信息

    6.往LCD写数据

    7.关闭BMP图片

    8.关闭LCD

实现代码和注解,特别是注解,请认真看,这里我还用到mmap映射(已经注释掉了,没参与运行),有兴趣的同志可以了解一下。代码最后面有运行提示。


 
 
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <linux/input.h>
  7. #include <sys/mman.h>
  8. //short * fb_mem; //这块的数据类型一定要注意,如果使用就要跟一个像素匹配两个字节(这里跟LCD一个像素由多少个字节组成有关)
  9. int lcd;
  10. int init_lcd()
  11. {
  12. lcd = open( "/dev/fb0",O_RDWR); //1.打开LCD设备
  13. if(lcd == -1)
  14. {
  15. perror( "open LCD Err");
  16. return -1;
  17. }
  18. printf( "request LCD OK!\n");
  19. /* //映射显存
  20. fb_mem = mmap(NULL, //映射后的地址,NULL系统自动分配
  21. 480*272*2, //映射的大小,字节
  22. PROT_READ|PROT_WRITE, //映射的操作
  23. MAP_SHARED, //映射的共享操作 MAP_SHARED MAP_PRIVATE
  24. lcd, //目标设备的文件描述符
  25. 0); //映射的数据地址偏移量,默认0
  26. if(fb_mem == MAP_FAILED)
  27. {
  28. perror("LCD mmap");
  29. return -1;
  30. } */
  31. }
  32. int uninit_lcd()
  33. {
  34. close(lcd); //关闭LCD
  35. /*取消映射*/
  36. /* munmap(fb_mem, //映射后的操作地址
  37. 480*272*2); //映射的大小 */
  38. }
  39. int show_bmp(char *file) //显示一张图片 思路
  40. {
  41. int ret,x,y,i;
  42. short lcdbuf[ 480* 272* 2]; //注意:因为此LCD是一个像素包含两个字节,所以要用short,用int类型则会出错
  43. char temp[ 3] = { 0};
  44. char bmpbuf[ 480* 272* 3];
  45. int bmp = open(file,O_RDONLY); //2.打开bmp图片
  46. if(bmp == -1)
  47. {
  48. perror( "open BMP Err");
  49. return -1;
  50. }
  51. lseek(bmp, 54, SEEK_SET); //偏移54个字节
  52. ret = read(bmp,bmpbuf, 480* 272* 3); //3.读取bmp信息
  53. if(ret == -1)
  54. {
  55. perror( "read BMP Err");
  56. return -1;
  57. }
  58. //4.将window下24位的bmp图像转化为ARM S3C2440下的16位的图片(存储RGB格式有变化)
  59. //change 24bit RGB to 16bit 思路:r:g:b = 5:6:5 取r的高五位,g的高6位,b的高5位,或运算,重新组成一个新的16位
  60. for(y= 0,i= 0;y< 272;y++)
  61. {
  62. for(x= 0;x< 480;x++,i+= 3)
  63. {
  64. // B G R
  65. lcdbuf[( 271-y)* 480+x] = (bmpbuf[i])>> 3 | (bmpbuf[i+ 1]>> 2)<< 5 | (bmpbuf[i+ 2]>> 3) << 11; //将24位转化为16位算法
  66. }
  67. }
  68. //memcpy(fb_mem,lcdbuf,480*272*2);
  69. //5.往LCD写数据
  70. ret = write(lcd,lcdbuf, 480* 272* 2);
  71. if(ret == -1)
  72. {
  73. perror( "write LCD Err");
  74. return -1;
  75. }
  76. //close(lcd); //6.关闭lcd,有专门的uninit_lcd函数关闭lcd
  77. close(bmp); //7.关闭图片
  78. return 0;
  79. }
  80. int main()
  81. {
  82. init_lcd(); //LCD 初始化
  83. printf( "my Project!\n");
  84. show_bmp( "picture_3.bmp");
  85. sleep( 3);
  86. uninit_lcd(); //关闭LCD
  87. return 0;
  88. }

把代码生成文件考到开发板上,同时也要把规定尺寸4.3寸(480*272)的BMP图片拷到开发板,我图片的名字是picture_3.bmp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值