从缓冲区加载图像 - 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.h
)stdafx.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编码&C | ID_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()
。
如果布尔参数bEncodedBase64为TRUE,则该函数将缓冲区视为 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
函数从内存缓冲区加载图像,可以直接加载,也可以在需要时解码后加载。