LEADTOOLS SDK 从缓冲区加载图像 - Windows C DLL

从缓冲区加载图像 - Windows C DLL

本教程介绍如何创建从缓冲区加载图像的 C/C++ Windows API 应用程序。

概述 
概括本教程介绍如何从 Windows C DLL 应用程序中的缓冲区加载图像。
完成时间30分钟
Visual Studio 项目下载教程项目 (18 KB)
平台Windows C DLL 应用程序
集成开发环境Visual Studio 2017、2019
开发许可证下载 LEADTOOLS
尝试使用其他语言

所需知识

在开始“从缓冲区加载图像 - Windows C DLL”教程之前,请先通过查看“添加引用”和“设置许可证”以及“加载、显示和保存图像”教程熟悉创建项目和加载图像的基本步骤。

创建项目并添加 LEADTOOLS 引用

从“加载、显示和保存图像”教程中创建的 64 位 Windows API 项目的副本开始。如果该项目不可用,请按照该教程中的步骤创建它。

从缓冲区加载图像教程所需的 LEADTOOLS 库文件与加载、显示和保存图像教程中已有的文件类似。请验证预编译头文件( 或pch.hstdafx.h是否包含以下行:

#define LTV23_CONFIG 
#include "C:\LEADTOOLS23\Include\L_Bitmap.h" // use actual path where you installed LEADTOOLS 
#pragma comment (lib, "C:\\LEADTOOLS23\\Lib\\CDLL\\x64\\Ltkrn_x.lib") 
#pragma comment (lib, "C:\\LEADTOOLS23\\Lib\\CDLL\\x64\\Ltfil_x.lib") // file loading and saving 
#pragma comment (lib, "C:\\LEADTOOLS23\\Lib\\CDLL\\x64\\Ltdis_x.lib") // image display 

注意:有关您的应用程序所需的 DLL 文件的完整列表,请参阅应用程序中包含的文件

本教程使用 Microsoft CryptoAPI 解码包含图像的 Base64 缓冲区,因此将以下行添加到预编译头文件中:

#pragma comment (lib, "Crypt32.lib") // link the CryptoAPI DLL 

设置许可证文件

许可证用于解锁项目所需的功能。必须在调用任何工具包函数之前设置许可证。有关详细信息(包括不同平台的教程),请参阅设置运行时许可证

运行时许可证有两种类型:

  • 评估许可证,在下载评估工具包时获得。它允许对工具包进行评估。
  • 部署许可证。如果需要部署许可证文件和开发者密钥,请参阅获取许可证

注意:在添加引用和设置许可证教程中更详细地介绍了添加 LEADTOOLS 引用和设置许可证

添加从缓冲区加载图像的代码

创建项目、添加参考、设置许可证并添加加载图像代码后,就可以开始编码了。

以下步骤适用于 Visual Studio 2019;对于其他版本的 Visual Studio,它们可能有所不同。

转到解决方案资源管理器并双击资源文件 (.rc)。

在打开菜单项下方的文件菜单添加两个新菜单项,如下所示。

项目文本商品 ID
从缓冲区加载(&L)ID_FILE_LOADFROMBUFFER
加载Base64编码&CID_FILE_LOADBASE64ENCODED

转到函数,在 case下方的语句WndProc下添加两个新案例:switch (wmId)WM_COMMAND

switch (wmId) 
{ 
case ID_FILE_LOADFROMBUFFER: // Load image from memory buffer 
   LoadFromBuffer(hWnd, L_FALSE); 
   break; 
case ID_FILE_LOADBASE64ENCODED: // Decode memory buffer then load image 
   LoadFromBuffer(hWnd, L_TRUE); 
   break; 
// keep rest of the code as is 

以下是该函数的代码LoadFromBuffer()
如果布尔参数bEncodedBase64TRUE,则​​该函数将缓冲区视为 Base64 编码,并在加载图像之前对其进行解码。

L_INT LoadFromBuffer(HWND hWnd, L_BOOL bEncodedBase64) 
{ 
   TCHAR szFileName[260] = TEXT(""); // file name 
   if (SUCCESS != GetBitmapLoadingName(hWnd, szFileName, ARRAYSIZE szFileName)) 
      return ERROR_NORMAL_ABORT; 
   FILE* fp = NULL; 
   _tfopen_s(&fp, szFileName, TEXT("rb")); 
   if (!fp) 
      return ERROR_FILENOTFOUND; 
   fseek(fp, 0L, SEEK_END); 
   long nFileSize = ftell(fp); 
   fseek(fp, 0L, SEEK_SET); 
   L_UCHAR* pBufferFile = new L_UCHAR[nFileSize]; 
   if (nFileSize != fread_s(pBufferFile, nFileSize, 1, nFileSize, fp)) 
   { 
      if (fp) 
         fclose(fp); 
      if (pBufferFile) 
         delete[] pBufferFile; 
      return ERROR_FILE_READ; 
   } 
   L_UCHAR* pBufferImage = NULL; 
   L_UCHAR* pBufferDecoded = NULL; 
   if (bEncodedBase64) // must decode file to obtain image 
   { 
      DWORD dwDecodedSize = 0; 
      CryptStringToBinaryA((LPCSTR)pBufferFile, nFileSize, CRYPT_STRING_BASE64_ANY, NULL, &dwDecodedSize, NULL, NULL); 
      pBufferDecoded = new L_UCHAR[dwDecodedSize]; 
      CryptStringToBinaryA((LPCSTR)pBufferFile, nFileSize, CRYPT_STRING_BASE64_ANY, pBufferDecoded, &dwDecodedSize, NULL, NULL); 
      pBufferImage = pBufferDecoded; 
   } 
   else //no decoding needed 
      pBufferImage = pBufferFile; 
   MessageBox(hWnd, TEXT("File loaded into memory buffer. Attempting to load image from buffer.."), TEXT("LEADTOOLS Demo"), MB_ICONINFORMATION); 
   if (LEADBmp.Flags.Allocated) 
      L_FreeBitmap(&LEADBmp); 
   L_INT nRet = L_LoadBitmapMemory(pBufferImage, &LEADBmp, sizeof LEADBmp, 24, ORDER_BGR, nFileSize, NULL, NULL); 
   InvalidateRect(hWnd, NULL, TRUE); 
   if (fp) 
      fclose(fp); 
   if (pBufferFile) 
      delete[] pBufferFile; 
   if (pBufferDecoded) 
      delete[] pBufferDecoded; 
   return nRet; 
} 

运行项目

按F5或选择“调试”->“开始调试”来运行项目。

如果正确遵循这些步骤,应用程序应该能够运行,并允许用户选择要加载到内存缓冲区的文件。如果文件中的图像采用 Base64 编码,则会提供一个选项来解码数据以获取图像。为了测试此选项,可以使用这个 Base64 编码的图像文件。

包起来

本教程介绍了如何使用该L_LoadBitmapMemory函数从内存缓冲区加载图像,可以直接加载,也可以在需要时解码后加载。

参见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值