本教程演示如何在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评论(自由,“C: \ \ LEADTOOLS21 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltfil_x.lib”)//文件加载和保存
# pragma评论(自由,“C: \ \ LEADTOOLS21 \ \ 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:
{
char szFileName[260] = TEXT("");/ /文件名
如果= GetBitmapLoadingName(hWnd, szFileName,运算符(szFileName)))
打破;
如果(LEADBmp.Flags.Allocated)
L_FreeBitmap (&LEADBmp);
L_LoadBitmap (szFileName &LEADBmp,运算符(LEADBmp), 24, ORDER_BGR, NULL, NULL);
InvalidateRect (hWnd, NULL,真的);
}
打破;
//保持代码的其余部分不变
的GetBitmapLoadingName ()
函数可以是任何函数szFileName
变量,该变量具有有效的图像文件名(如果需要,包括完整路径)。显示一个文件打开对话框获取文件名,添加以下代码:
GetBitmapLoadingName(HWND HWND, TCHAR* pszFileName, DWORD nLen)
{
OPENFILENAME = {0};
OpenFileName。lStructSize =运算符(OpenFileName);
OpenFileName。hwndOwner = hwnd;
OpenFileName。lpstrFile = pszFileName;
OpenFileName。nMaxFile = nLen;
OpenFileName。lpstrFilter =文本(“所有\ 0 *。* \ * . jpg jpeg \ 0 \ 0”);
OpenFileName。nFilterIndex = 1;
OpenFileName。lpstrFileTitle =零;
OpenFileName。nMaxFileTitle = 0;
OpenFileName。lpstrInitialDir =零;
OpenFileName。Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
//显示文件打开对话框
如果(! 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);
打破;
}
char szFileName[260] = TEXT("");/ /文件名
如果= GetBitmapSavingName(hWnd, szFileName,运算符(szFileName)))
打破;
L_SaveBitmap(szFileName, &LEADBmp, FILE_JPEG_411, 24,15, NULL);
}
打破;
//保持代码的其余部分不变
的GetBitmapSavingName ()
函数可以是任何函数szFileName
变量,该变量具有有效的图像文件名(如果需要,包括完整路径)。显示一个文件保存对话框获取文件名,添加以下代码:
GetBitmapSavingName(HWND HWND, TCHAR* pszFileName, DWORD nLen)
{
OPENFILENAME = {0};
OpenFileName。lStructSize =运算符(OPENFILENAME);
OpenFileName。hwndOwner = hwnd;
OpenFileName。lpstrFilter =文本(“Jpeg \ * . jpg 0 \ 0”);
OpenFileName。lpstrFile = pszFileName;
OpenFileName。nMaxFile = nLen;
OpenFileName。lpstrDefExt =文本(“jpg”);
OpenFileName。lpstrFileTitle =零;
OpenFileName。nMaxFileTitle = 0;
OpenFileName。lpstrInitialDir =零;
OpenFileName。旗帜= OFN_OVERWRITEPROMPT;
//显示文件保存对话框
如果(! GetSaveFileName (&OpenFileName))
返回失败;
返回成功;
}
重要提示
上面的代码将图像保存为24位JPEG格式。若要保存其他类型,请传递不同的值而不是
FILE_JPEG_411
.更多细节见LEADTOOLS图像格式帮助主题。
通过按运行项目F5,或选择调试->开始调试.
如果正确地遵循了这些步骤,应用程序应该会运行,并允许用户在计算机上加载LEADTOOLS编解码器过滤器支持的任何图像。图像将显示在主窗口中。按下保存菜单项将显示的图像保存为JPEG格式,保存在使用保存对话框.
本教程介绍了如何添加必要的dll来加载、显示和保存图像。还介绍了如何使用BITMAPHANDLE
结构与L_LoadBitmap
,L_SaveBitmap
,L_PaintDC
而且L_FreeBitmap
功能。