本教程展示了如何在C/ c++ Windows API应用程序中使用LEADTOOLS SDK加载、显示和保存图像。
概述 | |
---|---|
总结 | 本教程介绍如何在Windows C DLL应用程序中加载、显示和保存图像。 |
完成时间 | 30分钟 |
Visual Studio项目 | 下载教程项目(18kb) |
平台 | Windows C DLL应用程序 |
IDE | Visual Studio 2017, 2019 |
开发许可 | 下载LEADTOOLS |
在开始之前加载,显示和保存图像- Windows C DLL本教程中,通过回顾添加引用和设置License教程。
中创建的64位Windows API项目的副本添加引用和设置License教程。如果项目不可用,请按照该教程中的步骤创建它。
为了加载、显示和保存图像,LEADTOOLS需要额外的dll。也可以通过打开预编译的头文件添加所需的库pch.h
或stdafx.h
根据所使用的Visual Studio版本,并添加以下行:
#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltfil_x.lib”)//文件加载和保存
#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltdis_x.lib”)//图像显示
请注意
有关应用程序需要哪些DLL文件的完整列表,请参阅你的申请所包含的文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中更详细地介绍了添加LEADTOOLS引用和设置许可添加引用和设置License教程。
现在已经添加了LEADTOOLS引用并设置了许可证,可以开始编码了。
以下步骤适用于Visual Studio 2019;对于Visual Studio的其他版本,它们可能有所不同。
去解决方案资源管理器双击资源文件(.rc)
展开资源树中的菜单,双击菜单资源,在设计器界面中打开。
的空项中退出项,单击并键入状态.将新项目拖到上面退出.这将导致该项的ID变为ID_FILE_OPEN
.
转到项目的主CPP文件,其中包含指向()
函数用于主窗口。在靠近顶部的全局变量中添加以下声明:
BITMAPHANDLE LEADBmp;
导航到指向
函数和开关(wmId)
表述,就是下面的WM_COMMAND
Case,添加一个新的Case:
开关(wmId)
{
情况下ID_FILE_OPEN:
{
TCHAR szFileName[260] = TEXT("");//文件名称
如果= GetBitmapLoadingName(hWnd, szFileName, ARRAYSIZE(szFileName)))
打破;
如果(LEADBmp.Flags.Allocated)
L_FreeBitmap (&LEADBmp);
L_LoadBitmap (szFileName &LEADBmp,运算符(LEADBmp), 24, ORDER_BGR, NULL, NULL);
InvalidateRect(hWnd, NULL, TRUE);
}
打破;
//保留其余的代码
的GetBitmapLoadingName ()
函数可以是填充szFileName
变量,使用有效的映像文件名(如果需要,包括完整路径)。要显示文件打开对话框获取文件名,添加如下代码:
GetBitmapLoadingName(HWND HWND, tsar * pszFileName, DWORD nLen)
{
OPENFILENAME OPENFILENAME = {0};
OpenFileName。lStructSize =运算符(OpenFileName);
OpenFileName。hwndOwner = hwnd;
OpenFileName。lpstrFile = pszFileName;
OpenFileName。nMaxFile = nLen;
OpenFileName。lpstrFilter = TEXT(“所有\ 0 *。* \ * . jpg jpeg \ 0 \ 0”);
OpenFileName。nFilterIndex = 1;
OpenFileName。lpstrFileTitle = NULL;
OpenFileName。nMaxFileTitle = 0;
OpenFileName。lpstrInitialDir = NULL;
OpenFileName。Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
//显示File Open对话框
如果(! GetOpenFileName (&OpenFileName))
返回失败;
返回成功;
}
每当图像被分配到BITMAPHANDLE
结构,程序员必须调用L_FreeBitmap
当不再需要时释放它。由于加载位图分配这样的图像,调用LEADBmp.Flags.Allocated
在退出应用程序之前进行检查。
修改处理的案例WM_DESTROY
在指向()
函数变成:
情况下WM_DESTROY:
如果(LEADBmp.Flags.Allocated)
L_FreeBitmap (&LEADBmp);
PostQuitMessage (0);
打破;
修改处理的案例WM_PAINT
在指向()
函数变成:
情况下WM_PAINT:
{
PAINTSTRUCT ps;
HDC HDC = BeginPaint(hWnd, &ps);
// TODO:添加任何使用hdc的绘图代码…
RECT rc = {0,0, BITMAPWIDTH(&LEADBmp), BITMAPHEIGHT(&LEADBmp)};
如果(LEADBmp.Flags.Allocated)
L_PaintDC(hdc, &LEADBmp, NULL, NULL, &rc, NULL, SRCCOPY);
EndPaint (hWnd, ps);
}
打破;
重要提示
本教程中的加载代码强制图像以每像素24位的速度加载,这意味着加载后它将没有调色板。如果需要显示每像素1到8位之间的图像,则必须在绘制代码中处理调色板,如的代码示例所示L_PaintDC.
添加一个保存菜单项下的文件菜单。方法中的步骤类似添加位图加载代码部分,但将菜单项文本设置为并保存而不是状态,这将导致新项的ID为ID_FILE_SAVE
.
去指向
函数,和下开关(wmId)
语句的下面WM_COMMAND
Case,添加一个新的Case:
开关(wmId)
{
情况下ID_FILE_SAVE:
{
如果(LEADBmp.Flags.Allocated !)
{
对话框(hWnd,文本(不能救”。未加载图像”),文本(“LEADTOOLS演示”), MB_ICONERROR);
打破;
}
TCHAR szFileName[260] = TEXT("");//文件名称
如果= GetBitmapSavingName(hWnd, szFileName, ARRAYSIZE(szFileName)))
打破;
L_SaveBitmap(szFileName, &LEADBmp, FILE_JPEG_411, 24,15, NULL);
}
打破;
//保留其余的代码
的GetBitmapSavingName ()
函数可以是填充szFileName
变量,使用有效的映像文件名(如果需要,包括完整路径)。要显示文件保存对话框获取文件名,添加如下代码:
GetBitmapSavingName(HWND HWND, TCHAR* pszFileName, DWORD nLen)
{
OPENFILENAME OPENFILENAME = {0};
OpenFileName。lStructSize =运算符(OPENFILENAME);
OpenFileName。hwndOwner = hwnd;
OpenFileName。lpstrFilter = TEXT(“Jpeg \ * . jpg 0 \ 0”);
OpenFileName。lpstrFile = pszFileName;
OpenFileName。nMaxFile = nLen;
OpenFileName。lpstrDefExt = TEXT(“jpg”);
OpenFileName。lpstrFileTitle = NULL;
OpenFileName。nMaxFileTitle = 0;
OpenFileName。lpstrInitialDir = NULL;
OpenFileName。Flags = OFN_OVERWRITEPROMPT;
//显示文件保存对话框
如果(! GetSaveFileName (&OpenFileName))
返回失败;
返回成功;
}
重要提示
上面的代码将图像保存为24位JPEG格式。若要保存其他类型,请传递不同的值而不是
FILE_JPEG_411
.详情见图像格式帮助主题。
按下运行项目F5,或选择调试->开始调试.
如果正确地遵循了这些步骤,应用程序应该运行,并允许用户在机器上加载LEADTOOLS编解码器过滤器支持的任何图像。图像将显示在主窗口中。按下保存菜单项将显示的图像另存为JPEG格式,保存在使用保存对话框.
本教程介绍了如何添加必要的dll来加载、显示和保存图像。它还涵盖了如何使用BITMAPHANDLE
的结构L_LoadBitmap
,L_SaveBitmap
,L_PaintDC
而且L_FreeBitmap
功能。