BMP图像 - UEFI shell下显示bmp图片

本文介绍如何在UEFI Shell中实现显示BMP图片的功能。通过编写UEFI应用程序,利用BmpSupportLib库加载BMP文件并转换为GOP Blt数据,最后调用GraphicsOutput->Blt在屏幕上绘制图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现在uefi shell显示一张bmp图片
前面说到mp图像的扫描方式是按从左到右、从下到上的顺序,使用TranslateBmpToGopBlt转换成相应扫描数据,再用GraphicsOutput->Blt把相应扫描数据在屏幕上显示出来

1.inf文件

TestShowBmp.inf

## @file
# 
#  head for bmp test
#
#
#
##

[Defines]
  INF_VERSION                    = 0x00010006
  BASE_NAME                      = TestShowBmp
  FILE_GUID                      = 079E8E98-AE93-1111-8A71-88C869F23E09
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = ShellCEntryLib

#
# The following information is for reference only and not required by the build tools.
#
#  VALID_ARCHITECTURES           = IA32 X64 EBC
#

[Sources]
  TestShowBmp.c
  TestShowBmp.h

[Packages]
  MdePkg/MdePkg.dec
  ShellPkg/ShellPkg.dec
  MdeModulePkg/MdeModulePkg.dec

[LibraryClasses]
  ShellCEntryLib
  UefiLib
  UefiBootServicesTableLib
  BaseMemoryLib
  MemoryAllocationLib
  ShellLib
  BmpSupportLib

[Protocols]
	#gEfiSimpleFileSystemProtocolGuid, 
  gEfiGraphicsOutputProtocolGuid

2.c文件

TestShowBmp.c

/** @file
  This is a test for show bmp

**/

#include "TestShowBmp.h"

/**
  load bmp file to buffer

  @param   IN      CHAR16     *FileName
  @param   IN OUT  UINT8      **FileDataBuffer
  @param   IN OUT  UINTN      *DataLength

  @retval  EFI_SUCCESS
  @retval            

**/
EFI_STATUS
EFIAPI
LoadFiletoBuffer (
  IN      CHAR16           *FileName,
  IN OUT  UINT8            **FileDataBuffer,
  IN OUT  UINT64            *DataLength
)
{
  EFI_STATUS                      Status;
  EFI_FILE_HANDLE                 ReadFileHandle;
  EFI_FILE_PROTOCOL               *FileRoot;
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;  
  EFI_FILE_INFO                   *ReadFileInfo = NULL;
  

  Status = gBS->LocateProtocol(
						      &gEfiSimpleFileSystemProtocolGuid, 
						      NULL,
					     	  (VOID **)&SimpleFileSystem
                  );
  if (EFI_ERROR(Status)) {
		  Print (L"not found gEfiSimpleFileSystemProtocolGuid!\n");
      return Status;	
	}
  
  Status = SimpleFileSystem->OpenVolume(SimpleFileSystem, &FileRoot);
  if (EFI_ERROR(Status)) {
		Print (L"OpenVolume is error !\n");
    return Status;	
	}

  Status = FileRoot->Open(
						           FileRoot, 
							         &ReadFileHandle, 
							         FileName,
							         EFI_FILE_MODE_READ , 
							         0 
                       );
  if (EFI_ERROR (Status)) {
    Print (L"open file root is error!\n");
    return Status;
  }
  
  ReadFileInfo = ShellGetFileInfo( (SHELL_FILE_HANDLE)ReadFileHandle);

  *DataLength = ReadFileInfo->FileSize;
  *FileDataBuffer = (UINT8 *)AllocateZeroPool (*DataLength);

  Status = ReadFileHandle->Read (
                             ReadFileHandle,
                             DataLength,
                             *FileDataBuffer
                             );
  if (EFI_ERROR (Status)) {
    Print (L"Read file is error!\n");
    return Status;
  }	
  
  ReadFileHandle->Close (ReadFileHandle);
  FileRoot->Close (FileRoot);

  Print (L"Load File is Ok!\n");

  return Status;
}


/**
  UEFI application entry point which has an interface similar to a
  standard C main function.

  The ShellCEntryLib library instance wrappers the actual UEFI application
  entry point and calls this ShellAppMain function.

  @param  Argc             Argument count
  @param  Argv             The parsed arguments

  @retval  0               The application exited normally.
  @retval  Other           An error occurred.

**/
INTN
EFIAPI
ShellAppMain (
  IN UINTN Argc,
  IN CHAR16 **Argv
  )
{
  EFI_STATUS                       Status;
  EFI_GRAPHICS_OUTPUT_PROTOCOL     *GraphicsOutput = NULL;
  UINT8                            *BmpDataBuffer;
  UINT64                           DataLength;
  EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *EepromBitmap = NULL;
  UINTN                            GopBltSize;
  UINTN                            Height;
  UINTN                            Width;
  
  //Status = gST->ConOut->EnableCursor(gST->ConOut,FALSE);
  //Status = gST->ConOut->SetAttribute(gST->ConOut,EFI_WHITE|EFI_BACKGROUND_BLACK);
  //Status = gST->ConOut->ClearScreen(gST->ConOut);

  Status = gBS->LocateProtocol (
                  &gEfiGraphicsOutputProtocolGuid,
                  NULL,
                  (VOID **)&GraphicsOutput
                  );
  if (EFI_ERROR (Status)) {
    GraphicsOutput = NULL;
    Print (L"locate protocol gEfiGraphicsOutputProtocolGuid is error!\n");
    return Status;
  }
  
  Status = LoadFiletoBuffer (
             Argv[1],
             &BmpDataBuffer,
             &DataLength
             );
  if (EFI_ERROR (Status)) {
    Print (L"Load Bmp to Buffer is error!\n");
    return Status;
  }

  //
  // bmp to blt
  //
  Status = TranslateBmpToGopBlt (
             (VOID *)BmpDataBuffer,
             DataLength,
             &EepromBitmap,
             &GopBltSize,
             &Height,
             &Width
             );
  if (EFI_ERROR (Status)) {
    if (EepromBitmap != NULL) {
      FreePool (EepromBitmap);
    }
    Print (L"TranslateBmpToGopBlt is error!\n");
    return Status;
  }
  
  Status = GraphicsOutput->Blt (
                             GraphicsOutput,
                             EepromBitmap,
                             EfiBltBufferToVideo,
                             0,
                             0,
                             0x0,
                             0x0,
                             Width,
                             Height,
                             Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
                             );
  if (EFI_ERROR (Status)) {
    Print (L"GraphicsOutput Blt is error!\n");
    return Status;
  }
  if (EepromBitmap != NULL)
    FreePool (EepromBitmap);

  //Status = gST->ConOut->EnableCursor(gST->ConOut,TRUE);
  return 0;
}

3.h文件

TestShowBmp.h

/** @file

  a head for add a type smbios table

  Copyright (c) 2019 GreatWall All rigths reserved.<BR>

**/
#ifndef    TEST_SHOW_BMP_
#define    TEST_SHOW_BMP_

#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#include <Library/ShellCEntryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/ShellLib.h>
#include <Library/BmpSupportLib.h>

#include <IndustryStandard/Bmp.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/HiiImageEx.h>

#endif

效果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值