首页 > 其他分享 >在LCD屏幕上任意位置打开以缩减图片(待修改)

在LCD屏幕上任意位置打开以缩减图片(待修改)

时间:2024-05-12 20:43:08浏览次数:21  
标签:fp int bmp unsigned LCD 缩减 BMP 屏幕 bitmap

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/mman.h>



#pragma pack(1) //设置取消字节对齐

// 文件信息结构体

typedef struct tag_bitmap_file_header

{

  unsigned short file_type; // 文件标识,为字母ASCII码“BM”

  unsigned int file_size;  // 位图文件大小,以字节为单位

  unsigned short reserved1; // 位图文件保留字,必须为0

  unsigned short reserved2; // 位图文件保留字,必须为0

  unsigned int offset_bits; // 文件开始到位图数据开始之间的偏移量字节

}bmp_file_header;



// 位图信息结构体

typedef struct tag_bitmap_info_header

{

  unsigned int bitmap_info_size; // 图像描述信息快的大小,常为28H

  int bitmap_width;        // 图像宽度

  int bitmap_height;       // 图像高度

  unsigned short planes;     // 图像的plane总数(恒为1)

  unsigned short image_depth;   // 记录颜色的位数取值1(双色),4,6,24,,3

  unsigned int compression;    // 数据压缩方式(0:不压缩;1:8位压缩;2:4位压缩

  unsigned int image_size;    // 图像区数据的大小,必须是4的倍数

  int x_pels_permeter;      // 水平每米有多少像素,在设备无关位图中,填写00H

  int y_pels_permeter;      // 垂直每米有多少像素,在设备无关位图中,填写00H

  unsigned int color_used;    // 此图像所有的颜色数,不用,固定为0

  unsigned int color_important;  // 重要颜色数,不用,固定为0

}bmp_info_header;



#pragma pack() //设置为字节对齐



int main()

{

  //1.打开bmp图片文件

  FILE * bmp_fp = fopen("demo.bmp","rb");

  if(NULL == bmp_fp)

  {

​    printf("open bmp file faild\n");

​    return -1;

  }



  //2.读取BMP图片文件的图像信息,获取BMP的宽和高

  bmp_info_header headerinfo;   //BMP头文件信息结构体

  bmp_file_header newheaderinfo1;

  bmp_info_header newheaderinfo;   //BMP头文件信息结构体

  fseek(bmp_fp,14,SEEK_SET);

  fread(&headerinfo,1,40,bmp_fp); //读取BMP头文件信息

  printf("current bmp width = %d\ncurrent bmp height = %d\n",headerinfo.bitmap_width,headerinfo.bitmap_height);//输出BMP图片宽度和高度信息

  

  //3.读取BMP图片的颜色分量

  int pxsize = headerinfo.bitmap_width*headerinfo.bitmap_height*headerinfo.image_depth/8;

  printf("pxsize = %d\n",pxsize);

  char bmp_buf[pxsize];      //申请图片像素大小的缓冲区

  fread(bmp_buf,1,pxsize,bmp_fp); //读取BMP颜色分量数据

  fseek(bmp_fp,0,SEEK_SET);    //设置光标为文件开头



  fread(&newheaderinfo1,1,14,bmp_fp); //读取BMP头文件信息

  newheaderinfo1.file_size = 400*240*3;

  fread(&newheaderinfo,1,40,bmp_fp); //读取BMP头文件信息

  newheaderinfo.bitmap_width = 400;

  newheaderinfo.bitmap_height = 240;

  fclose(bmp_fp);

  char newbmp_buf[pxsize/4];



  int cnt = 0;

  for(int y = 0;y < 480; y+=2)

  {

​    for(int x = 0; x < 800 ;x+=2)

​    {

​      for(int k=0; k<3; k++)

​      {

​        //newbmp_buf[cnt] = bmp_buf[(y*480+x)*3+k];

​        newbmp_buf[cnt] = bmp_buf[(y*800+x)*3+k];

​        cnt++;

​      }

​    }

  }

  //printf("%d\n",cnt);



  //打开待写入的文件

  FILE * newbmp_fp = fopen("newdemo.bmp","wb+");

  if(NULL == newbmp_fp)

  {

​    printf("open bmp file faild\n");

​    return -1;

  }

  int fp = fwrite(&newheaderinfo1,1,14,newbmp_fp);

  if(fp != 14)

  {

​    printf("write failed\n");

  }



  fwrite(&newheaderinfo,1,40,newbmp_fp);

  fwrite(&newbmp_buf,1,400*240*3,newbmp_fp);

  fseek(bmp_fp,54,SEEK_SET);    //设置光标为文件颜色分量开头

  char Newbmp_buf[pxsize/4];

  fread(Newbmp_buf,1,pxsize/4,newbmp_fp);

  fclose(newbmp_fp);





  //5.打开LCD

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

  

  //6.对LCD进行内存映射

  int lcd_pxsize = 800*480*4;

  int * lcd_mp = (int *)mmap(NULL,lcd_pxsize,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0);



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

  int i = 0;

  int data = 0;



  for (int y = 240-1; y >= 0; y--)

  {

​    for (int x = 0; x < 400 ; ++x)

​    {

​      //把BMP图片的一个像素点的颜色分量转换为LCD屏幕的一个像素点的颜色分量格式  ARGB <--- BGR

​      data |= Newbmp_buf[i];      //B

​      data |= Newbmp_buf[i+1]<<8; //G

​      data |= Newbmp_buf[i+2]<<16;   //R



​      lcd_mp[800*y + x] = data;  //BGR BGR BGR .... 



​      i+=3;  

​      data = 0;

​    }

  }

  

  //8.关闭LCD

  close(lcd_fd);

  munmap(lcd_mp,lcd_pxsize);



  return 0;

}

标签:fp,int,bmp,unsigned,LCD,缩减,BMP,屏幕,bitmap
From: https://www.cnblogs.com/zeratul/p/18188144

相关文章

  • 自定义函数在LCD上显示一张不超过LCD像素大小的色深为 24bit的bmp图片
    设计程序实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。头文件包含#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>#include<linux/......
  • 在 LCD 上任意位置显示一张任意大小
    /***************************************************************************************filename:1.c*author: lu.ciana.598393@gmail.com*date:2024/05/12*function: 设计程序,实现在LCD上任意位置显示一张任意大小*note :none*......
  • 在lcd屏幕上的任意位置显示任意大小的图片
    /***************************************************filename:ShowBmp2.c*author:momolyl@126.com*date:2024/05/12*brief:在lcd屏幕上的任意位置显示任意大小的图片*note:None**CopyRight(c)2024momolyl@126.com......
  • 获取lcd设备分辨率 色深
    /********************************************************************* filename: get_dev_info.c* author :lzj* date :2024/05/11* function:获取lcd设备分辨率*色深* note :None** CopyRight(c)2023-2024jjh6lzj@163.comAllRightReseverd......
  • 通过内存映射的方式向lcd屏幕输出几个圆
    /***************************************************filename:color.c*author:momolyl@126.com*date:2024/05/11*brief:通过内存映射的方式向lcd屏幕输出几个圆*note:None**CopyRight(c)2024momolyl@126.comAll......
  • Copilot - OpenAI与GitHub联合出品的自动代码生成AI+VirtualLCD - 可用于 GUI 移植的
    1、AntOS-适用8051的超轻量级实时操作系统AntOS是一款超轻量级实时操作系统,抢占式调度极简内核,专门为小型家电及轻量型物联网终端设计,适合在8051为内核的MCU上运行。项目主页: https://gitee.com/zeweni/ant-osAntOS提供层级服务,可以进行任意裁剪。内核层包含两个子系......
  • VKL060/076 SSOP24/28 超低功耗LCD液晶段码屏驱动芯片适用水电表/温湿度计,FAE技术支持
    VKL060概述: VKL060是一个点阵式存储映射的LCD驱动器,可支持最大60点(15SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。功能特点:•  工......
  • 调用lcd屏输出德国国旗
    /***************************************************filename:color.c*author:momolyl@126.com*date:2024/05/10*brief:向lcd屏幕输出德国国旗*note:None**CopyRight(c)2024momolyl@126.comAllRightReseverd......
  • 网页根据屏幕宽度请求不同的CSS文件
    网页根据屏幕宽度请求不同的CSS文件前言:重在记录,可能出错。一、代码<!DOCTYPEhtml><htmllang="ch"> <head> <title>网页根据屏幕宽度请求不同的CSS文件</title> <linkid="desktop-style"media="onlyscreenand(min-width:960px)"type=&......
  • (VKL系列)超低功耗LCD液晶显示驱动IC-VKL76 SSOP28,19*4 76点阵,超低工作电流约7.5微安,
    VKL076概述:VKL076是一个点阵式存储映射的LCD驱动器,可支持最大76点(19SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。功能特点:•  工......