本教程展示如何创建一个C/ c++ Windows API应用程序,从缓冲区加载图像。
概述 | |
---|---|
总结 | 本教程介绍如何从Windows C DLL应用程序中的缓冲区加载图像。 |
完成时间 | 30分钟 |
Visual Studio项目 | 下载教程项目(20kb) |
平台 | Windows C DLL应用程序 |
IDE | Visual Studio 2017, 2019 |
开发许可 | 下载LEADTOOLS |
用另一种语言试试 |
|
在开始之前从缓冲区加载图像- Windows C DLL教程,熟悉创建项目和加载图像的基本步骤添加引用和设置License而且加载、显示和保存图像教程。
中创建的64位Windows API项目的副本加载、显示和保存图像教程。如果项目不可用,请按照该教程中的步骤创建它。
所需的LEADTOOLS库文件从缓冲区加载图像的教程与已有的教程类似加载、显示和保存图像教程。验证预编译的头文件(或pch.h
或stdafx.h
)包含以下行:
#定义LTV22_CONFIG
# include“C: \ LEADTOOLS22 \ \ L_Bitmap.h包括”//使用安装LEADTOOLS的实际路径
#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltkrn_x.lib”)
#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltfil_x.lib”)//文件加载和保存
#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltdis_x.lib”)//图像显示
请注意
有关应用程序需要哪些DLL文件的完整列表,请参阅你的申请所包含的文件.
本教程使用Microsoft CryptoAPI解码包含图像的Base64缓冲区,因此在预编译的头文件中添加以下行:
#pragma comment (lib,“Crypt32.lib”)//链接CryptoAPI DLL
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中更详细地介绍了添加LEADTOOLS引用和设置许可添加引用和设置License教程。
随着项目的创建、引用的添加、许可证的设置和加载图像代码的添加,编码就可以开始了。
以下步骤适用于Visual Studio 2019;对于Visual Studio的其他版本,它们可能有所不同。
去解决方案资源管理器双击资源文件(.rc)。
控件中添加两个新菜单项文件菜单开放菜单项如下。
项文本 | 项ID |
---|---|
&从缓冲区加载 | ID_FILE_LOADFROMBUFFER |
加载&Base64编码 | ID_FILE_LOADBASE64ENCODED |
去指向
函数,和下开关(wmId)
语句的下面WM_COMMAND
Case,添加两个新案例:
开关(wmId)
{
情况下ID_FILE_LOADFROMBUFFER://从内存缓冲区加载图像
LoadFromBuffer (hWnd, L_FALSE);
打破;
情况下ID_FILE_LOADBASE64ENCODED://解码内存缓冲区然后加载图像
LoadFromBuffer (hWnd, L_TRUE);
打破;
//保留其余的代码
的代码LoadFromBuffer ()
函数。
如果布尔参数bEncodedBase64是真正的,该函数将缓冲区视为base64编码,并在加载图像之前对其进行解码。
L_INT LoadFromBuffer(HWND HWND, L_BOOL bEncodedBase64)
{
TCHAR szFileName[260] = TEXT("");//文件名称
如果= GetBitmapLoadingName(hWnd, szFileName, ARRAYSIZE szFileName))
返回ERROR_NORMAL_ABORT;
文件* fp = NULL;
_ttfopen_s (&fp, szFileName, TEXT(“rb”));
如果(fp)
返回ERROR_FILENOTFOUND;
fseek(fp, 0L, SEEK_END);
长nfilesystem = ftell(fp);
fseek(fp, 0L, SEEK_SET);
L_UCHAR* pBufferFile =新L_UCHAR [nFileSize];
如果= fread_s(pBufferFile, nFileSize, 1, nFileSize, fp))
{
如果(fp)
文件关闭(fp);
如果(pBufferFile)
删除[] pBufferFile;
返回ERROR_FILE_READ;
}
L_UCHAR* pBufferImage = NULL;
L_UCHAR* pBufferDecoded = NULL;
如果(bEncodedBase64)//必须解码文件来获取图像
{
DWORD dwDecodedSize = 0;
CryptStringToBinaryA((LPCSTR)pBufferFile, nFileSize, CRYPT_STRING_BASE64_ANY, NULL, &dwDecodedSize, NULL, NULL);
pBufferDecoded =新L_UCHAR [dwDecodedSize];
CryptStringToBinaryA((LPCSTR)pBufferFile, nFileSize, CRYPT_STRING_BASE64_ANY, pBufferDecoded, &dwDecodedSize, NULL, NULL);
pBufferImage = pBufferDecoded;
}
其他的//不需要解码
pBufferImage = pBufferFile;
对话框(hWnd,文本("文件已载入内存缓冲区。试图从缓冲区加载图像.."),文本(“LEADTOOLS演示”), MB_ICONINFORMATION);
如果(LEADBmp.Flags.Allocated)
L_FreeBitmap (&LEADBmp);
L_INT nRet = L_LoadBitmapMemory(pBufferImage, &LEADBmp,运算符LEADBmp, 24, ORDER_BGR, nFileSize, NULL, NULL);
InvalidateRect(hWnd, NULL, TRUE);
如果(fp)
文件关闭(fp);
如果(pBufferFile)
删除[] pBufferFile;
如果(pBufferDecoded)
删除[] pBufferDecoded;
返回nRet;
}
按下运行项目F5,或选择Debug ->开始调试.
如果正确地执行了这些步骤,应用程序将运行并允许用户选择要加载到内存缓冲区中的文件。如果文件中的图像使用Base64编码,则提供一个选项来解码数据以从中获得图像。为了测试这个选项,这个base64编码的映像文件可以使用。
本教程介绍如何使用L_LoadBitmapMemory
函数从内存缓冲区加载图像,直接或在需要时解码它们。