設計程式,實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,要求圖像不失真可以在開發板的LCD上顯示。

来源:https://www.cnblogs.com/cwp-home/p/18190114
-Advertisement-
Play Games

文件IO練習題 設計程式,實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,要求圖像不失真可以在開發板的LCD上顯示。 代碼: /*************************************************************************** ...


文件IO練習題

設計程式,實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,要求圖像不失真可以在開發板的LCD上顯示。

代碼:

/*****************************************************************************************************************
*	
*	file name	:	ShowBmp.c
*	author	 	:	[email protected]
*	data  	 	:	2024/05/13
*	function	:	實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,不要越界
*	note	 	  :	None
* 	
*  	CopyRight (c)	2024	[email protected] 	All Right Reseverd
*
* ****************************************************************************************************************/

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

#pragma pack(1)

// 定義BMP文件頭部結構
typedef struct{
	unsigned short bfType;          //標識該文件為bmp文件,判斷文件是否為bmp文件,即用該值與"0x4d42"比較是否相等即可,0x4d42 = 19778
	unsigned int   bfSize;          //點陣圖文件大小,包括這14個位元組。
	unsigned short bfReserved1;     //預保留位,暫不用。
	unsigned short bfReserved2;     //預保留位,暫不用。
	unsigned int   bfOffBits;       //圖像數據區的起始位置
}BITMAPFILEHEADER;                  //文件頭

typedef struct{
	unsigned int biSize;            //本結構的長度,為40個位元組。
	int biWidth;				    //寬度
	int biHeight;				    //高度
	unsigned short biPlanes;        //目標設備的級別,必須是1。
	unsigned short biBitCount;	    //色深,每個像素所占的位數(bit),其值必須為1(黑白圖像)、4(16色圖)、8(256色)、24(真彩色圖),新的BMP格式支持32位色。
	unsigned int biCompression;     //壓縮方式,有效的值為BI_RGB(未經壓縮)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均為Windows定義常量)。
	unsigned int biSizeImage;       //圖像區數據大小,即實際的點陣圖數據占用的位元組數
	int biXPelsPerMeter;            //水平解析度,像素每米
	int biYPelsPerMeter;            //垂直解析度,單位是像素/米
	unsigned int biClrUsed;         //點陣圖實際用到的顏色數,如果該值為零,則用到的顏色數為2的biBitCount次冪。
	unsigned int biClrImportant;    //點陣圖顯示過程,重要的顏色數;0--所有都重要
}BITMAPINFOHEADER;     


#pragma pack()

void ShowBmp(char *name,int x1,int y1,int *lcd_mp)
{
	//1.打開待顯示的BMP圖像  fopen
	FILE * bmp_fp = fopen(name,"rb");
	if (NULL == bmp_fp)
	{
		return -1;
	}

	//2.讀取BMP文件的圖像信息,獲取BMP的寬和高
	BITMAPINFOHEADER headerinfo;
	BITMAPFILEHEADER headerfile;
	fseek(bmp_fp,sizeof(headerfile),SEEK_SET);
	fread(&headerinfo,1,sizeof(headerinfo),bmp_fp); //讀取40位元組
	printf("bmp width = %d,height = %d\n",headerinfo.biWidth,headerinfo.biHeight);

	//3.讀取BMP圖*片的顏色分量  800*480*3
	char *bmp_buf = calloc(1,headerinfo.biWidth*headerinfo.biHeight*(headerinfo.biBitCount/8));
	fread(bmp_buf,1,headerinfo.biWidth*headerinfo.biHeight*(headerinfo.biBitCount/8),bmp_fp);

	//4.關閉BMP
	fclose(bmp_fp);

	//5.打開LCD   open  
	int lcd_fd = open(lcd_mp,O_RDWR);


	//6.對LCD進行記憶體映射  mmap
	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 = y1+headerinfo.biHeight-1; y >= y1; y--)
	{
		for (int x = x1; x < x1+headerinfo.biWidth ; ++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,800*480*4);
}


int main(int argc, char const *argv[])
{
	int x,y;
	//1.用戶輸入任意位置的坐標
  	printf("please input your x and y coordinate:");
  	scanf("%d %d",&x,&y);


	ShowBmp(argv[1],x,y,"/dev/fb0");
	return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 目錄一、什麼是PXE1、簡介2、工作模式3、工作流程二、什麼是Kickstart1、簡介2、觸發方式三、無人值守安裝系統工作流程四、實驗部署1、環境準備2、服務端:關閉防火牆和selinux3、添加一張僅主機的網卡4、配置僅主機的網卡4.1、修改網路連接名4.2、配IP地址4.3、重啟網卡5、配置D ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...