LCD屏顯示圖片習題【一】

来源:https://www.cnblogs.com/fly-home/p/18188553
-Advertisement-
Play Games

解題的關鍵在於 顯示圖片的雙重for迴圈條件與目標位置的結合,且該程式輸入的坐標值為圖片左上角像素點坐標 ...


目錄

LCD屏顯示圖片習題

題目

image

解析

​ 該題的顯著要求有兩個,一是任意位置,二是任意大小。為滿足這兩個要求得先讀取並記錄bmp數據,且bmp文件屬於普通文件,所以選擇標準IO函數fopen()打開bmp,並用結構體變數進行記錄;然後為了提升用戶使用體驗,即bmp在顯示時不會出現黑線,對LCD屏進行記憶體映射,最後使用獲取到的x1和y1作為迴圈條件,完成任意大小的bmp在任意位置顯示。

image

代碼完整展示

/*******************************************************************
*
*	file name:	ShowBmp.c
*	author	 :  [email protected]
*	date	 :  2024/05/13
*	function :  該案例是掌握LCD屏顯示圖片的基本原理
* 	note	 :  None
*
*	CopyRight (c)  2023-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>
#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()

/********************************************************************
*
*	name	 :	ShowBmp
*	function :  實現任意圖片大小在任意位置進行顯示
*	argument :
*				@fname  :需要顯示的圖片文件路徑
				@x1 	:圖片顯示位置的橫坐標
				@y1		:圖片顯示位置的橫坐標
*
*	retval	 :  調用成功返回0,否則返回-1;
*	author	 :  [email protected]
*	date	 :  2024/05/13
* 	note	 :  none
*
* *****************************************************************/
int ShowBmp(const char *fname,int x1,int y1)
{

	//1.打開待顯示的BMP圖像  fopen
	FILE * bmp_fp = fopen(fname,"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圖片的顏色分量  800*480*3
	char *bmp_buf= calloc(1,3*(headerinfo.biWidth)*(headerinfo.biHeight));
	fread(bmp_buf,1,3*(headerinfo.biWidth)*(headerinfo.biHeight),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,4*800*480,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0);

	//7.迴圈的把BMP圖像的顏色分量依次寫入到LCD的像素點中 
	int i = 0;
	int data = 0;

	//設置圖片位置的關鍵在於迴圈條件,且要註意映射時需要從圖片最後一行開始
	for (int y = 480 - (480 - headerinfo.biHeight - y1) - 1; y >= y1; y--)
	{
		for (int x = x1; x < headerinfo.biWidth + x1; ++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);

	return 0;
}
int main(int argc, char const *argv[])
{
	int x1 = 0, y1 = 0;
	//獲取用戶想要的圖片顯示位置
	printf("Please input x1 = \n");
	scanf("%d", &x1);
	printf("Please input y1 = \n");
	scanf("%d", &y1);
	//調用顯示函數
	ShowBmp(argv[1],x1,y1);

	return 0;
}



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

-Advertisement-
Play Games
更多相關文章
  • 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 ...
  • 文件IO練習題 設計程式,實現在LCD上任意位置顯示一張任意大小的色深為24bit的bmp圖片,要求圖像不失真可以在開發板的LCD上顯示。 代碼: /*************************************************************************** ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...