首页 > 其他分享 >bmp任意大小任意尺寸显示在lcd屏内

bmp任意大小任意尺寸显示在lcd屏内

时间:2024-05-12 20:57:08浏览次数:13  
标签:headerinfo int 屏内 bmp unsigned lcd BMP include 任意

IO编程

在LCD屏内显示任意尺寸任意大小的图像

image

/****************************************************************************
 *
 * file name: 2024-05-12_ShowBmp.c
 * author   : [email protected]
 * date     : 2024-05-12
 * function : 在LCD上显示任意大小任意尺寸的bmp图片
 * note     : None
 * CopyRight (c)   2024  [email protected]   Right Reseverd
 *
 ****************************************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdlib.h>

#pragma pack(1)

// 定义BMP文件头部结构
typedef struct
{
  unsigned short bfType;
  unsigned int bfSize;
  unsigned short bfReserved1;
  unsigned short bfReserved2;
  unsigned int bfOffBits;
} BITMAPFILEHEADER;

typedef struct
{
  unsigned int biSize;
  int biWidth;  // 宽
  int biHeight; // 高
  unsigned short biPlanes;
  unsigned short biBitCount; // 色深
  unsigned int biCompression;
  unsigned int biSizeImage;
  int biXPelsPerMeter;
  int biYPelsPerMeter;
  unsigned int biClrUsed;
  unsigned int biClrImportant;
} BITMAPINFOHEADER;

#pragma pack()


/****************************************************************************
 *
 * function name     :ShowBmp
 * function          : 显示图片
 * parameter         :
 *                      @name
 *                      @x
 *                      @y
 *
 * Return results    : none
 * note              : None
 * author            : [email protected]
 * date              : 2024-05-12
 * version           : V1.0
 * revision history  : None
 *
 ****************************************************************************/
int ShowBmp(const char *name, int x, int y)
{
  // 1.打开待显示的BMP图像  fopen
  FILE *bmp_fp = fopen("name", "rb");
  if (NULL == bmp_fp)
  {
    return -1;
  }

  // 2.读取BMP文件的图像信息,获取BMP的宽和高
  BITMAPINFOHEADER headerinfo;
  BITMAPFILEHEADER fileinfo;
  fseek(bmp_fp, 14, SEEK_SET);
  fread(&headerinfo, 1, 40, bmp_fp); // 读取40字节
  printf("bmp width = %d,height = %d\n", headerinfo.biWidth, headerinfo.biHeight);

  // 3.读取BMP图片的颜色分量
  char *bmp_buf = calloc(3 * (headerinfo.biWidth) * (headerinfo.biHeight), 1);
  int offset = (4 - (pic.biWidth * 3) % 4) % 4;
  fread(bmp_buf, 1, 3 * (headerinfo.biWidth) * (headerinfo.biHeight), bmp_fp);
  fseek(bmp_fp, offset, SEEK_CUR);

  // 4.关闭BMP
  fclose(bmp_fp);

  // 5.打开LCD   open
  int lcd_fd = open("/dev/fb0", O_RDWR);
  if (-1 == bmp_fd)
  {
    printf("open %s is error\n", argv[1]);
    return -1;
  }

  // 6.对LCD进行内存映射  mmap
  int *lcd_mp = (int *)mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);

  // 7.循环的把BMP图像的颜色分量依次写入到LCD的像素点中

  if (headerinfo.biHeight > 480 || headerinfo.biWidth > 800)
  {
    printf("your bmp'size over!");
  }

  int i = 0;
  int data = 0;

  for (int j = y + headerinfo.biHeight - 1; j >= y; j--)
  {
    for (int k = x; k < headerinfo.biWidth + x; ++k)
    {
      // 把BMP图片的一个像素点的颜色分量转换为LCD屏幕的一个像素点的颜色分量格式  ARGB <--- BGR
      data |= bmp_buf[i];           // B
      data |= bmp_buf[i + 1] << 8;  // G
      data |= bmp_buf[i + 2] << 16; // R

      lcd_mp[800 * j + k] = data; // BGR BGR BGR ....

      i += 3;
      data = 0;
    }
  }
  // 8.关闭LCD
  close(lcd_fd);
  munmap(lcd_mp, 800 * 480 * 4);
  return 0;
}


// 测试
int main(int argc, char const *argv[])
{
  ShowBmp(argv[1], 202, 200); // 输入任意位置坐标把图片放在相应位置
  return 0;
}

标签:headerinfo,int,屏内,bmp,unsigned,lcd,BMP,include,任意
From: https://www.cnblogs.com/little-mirror/p/18188168

相关文章