首页 > 其他分享 >BMP图片的复制#显示到显示屏

BMP图片的复制#显示到显示屏

时间:2024-05-14 08:58:43浏览次数:26  
标签:fp int 显示屏 unsigned bmp BMP 复制 include

复制BMP图片

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdlib.h>
/*
 *   复制bmp图片
 *
 *
 */
#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()

int main(int argc, char const *argv[])
{
    // 1.打开BMP图像
    FILE *bmp_fp = fopen("1.bmp", "rb");
    if (NULL == bmp_fp)
    {
        return -1;
    }
    // 2
    BITMAPFILEHEADER h1; // 文件头    14
    BITMAPINFOHEADER h2; // 信息头    40

    fread(&h1, 1, 14, bmp_fp);
    fread(&h2, 1, 40, bmp_fp);

    // 3每次读一行像素点颜色分量大小
    int line_size = h2.biWidth * 3;
    char *src_pbuf = (char *)calloc(1, line_size);

    // 4打开新图片
    FILE *new_fp = fopen("new.bmp", "wb");
    // 信息写入新图片
    fwrite(&h1, 1, 14, new_fp);
    fwrite(&h2, 1, 40, new_fp);

    // 数据写入新图片
    int line_num = h2.biHeight;
    while (line_num--)
    {
        // 读:空间+1+颜色分量+打开的原图
        fread(src_pbuf, 1, line_size, bmp_fp);
        // 写
        fwrite(src_pbuf, 1, line_size, new_fp);
    }

    return 0;
}

BMP图片显示到显示器

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
/*
 *   把400*240bmp图片展示到800*480的显示屏中
 *
 *
 */
#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()


int main(int argc, char const *argv[])
{
	//1.打开待显示的BMP图像  fopen
	FILE * bmp_fp = fopen("1.bmp","rb");
	if (NULL == bmp_fp)
	{
		return -1;
	}

	//2.读取BMP文件的图像信息,获取BMP的宽和高
	BITMAPINFOHEADER headerinfo;
	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图*片的颜色分量  400* 240*3h
	char bmp_buf[400*240*3] = {0};
	fread(bmp_buf,1,400*240*3,bmp_fp);

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

	//5.打开LCD   open  
	int lcd_fd = open("/dev/fb0",O_RDWR);


	//6.对LCD进行内存映射  mmap
	int * lcd_mp = (int *)mmap(NULL,800*480*4,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 |= bmp_buf[i];			//B
			data |= bmp_buf[i+1]<<8;	//G
			data |= bmp_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,400*240*4);

	return 0;
}

标签:fp,int,显示屏,unsigned,bmp,BMP,复制,include
From: https://www.cnblogs.com/zcx0326/p/18190510

相关文章

  • 设计程序,实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真
    文件IO练习题设计程序,实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。代码:/****************************************************************************************************************** * filename : Show......
  • 实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发板,展
    /***********************************************************************************************************实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发*板,展示缩放后的bmp文件****Copyright(c)2023-202418975491291......
  • 将bmp文件转换成JPEG(待修改,目前可转换但图片倒转)
    #include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<sys/mman.h>/**IncludefileforusersofJPEGlibrary.*Youwillneedtoha......
  • NumPy 数组复制与视图详解
    NumPy数组的复制与视图NumPy数组的复制和视图是两种不同的方式来创建新数组,它们之间存在着重要的区别。复制复制会创建一个包含原始数组相同元素的新数组,但这两个数组拥有独立的内存空间。这意味着对复制进行的任何更改都不会影响原始数组,反之亦然。创建副本可以使用以下方......
  • docker 环境如何复制到另外一台
    如何将Docker环境复制到另外一台机器在使用Docker进行软件开发和部署时,我们经常会面临需要将一个已经配置好的Docker环境复制到另外一台机器上的情况。本文将介绍一种简单的方法来解决这个问题,并提供相应的代码示例。问题背景假设我们在一台机器上已经成功配置好了一个Doc......
  • openGauss 逻辑复制
    逻辑复制逻辑解码使用逻辑复制工具复制数据发布订阅详情查看:https://opengauss.org详情查看:https://docs-opengauss.osinfra.cn......
  • openGauss 逻辑复制支持DDL操作
    逻辑复制支持DDL操作功能描述Vastbase在逻辑复制过程中支持如下DDL操作:CREATE/DROPTABLE|TABLEPARTITIONCREATE/DROPINDEX注意事项只支持行存表的DDL操作。不支持列存,ustore存储引擎。在订阅端手动删除表会导致DDL同步失败,发布订阅阻塞。不支持在对表进行相......
  • 如何批量复制多个文件到多个目录中(提取匹配法)
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z具体操作1、情景再现我这里创建了3个数字命名的文件夹和一些带有数字命名的图片文件。(这里仅做演示作用,实际操作的数量肯定巨大。)观察一下发现,图片分2种命名:一种是'数字.png',另一种是'-数字.png',前面带个了'-'......
  • 将任意bmp图片大小重新设置后生成新的bmp图片
    #include<stdio.h>#include<stdlib.h>#include<string.h>#pragmapack(1)/*必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐*/typedefstructtagBITMAPFILEHEADER{ unsignedshortbfType; //保存图片类型。'BM' unsignedlongbfSize; //位图......
  • BMP格式图片缩放及在LCD屏幕展示练习
    /***@brief:实现bmp格式图片的2倍缩小功能,并输出新的目标bmp格式文件。最后利用800*480的开发板,展示缩放后的bmp文件因为只是进行函数练习,未采用函数封装的做法*@[email protected]*@date2024/05/12*CopyRight(c)2023-2024ni456xinmie@1......