在MFC中,可以使用GDI+库来实现图像的旋转。以下是一个示例函数,展示如何将BMP图像向右旋转90度。首先,确保在项目中包含GDI+库,并在项目设置中添加#include
和#pragma comment(lib, "gdiplus.lib")
。
#include
#include
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
// 初始化GDI+
ULONG_PTR InitializeGDIPlus() {
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
return gdiplusToken;
}
// 关闭GDI+
void ShutdownGDIPlus(ULONG_PTR gdiplusToken) {
GdiplusShutdown(gdiplusToken);
}
// 函数:将BMP图像向右旋转90度
void RotateImageRight90(const WCHAR* inputPath, const WCHAR* outputPath) {
// 初始化GDI+
ULONG_PTR token = InitializeGDIPlus();
// 加载图像
Bitmap* bitmap = new Bitmap(inputPath);
// 旋转图像
bitmap->RotateFlip(Rotate90FlipNone);
// 保存图像
CLSID bmpClsid;
CLSIDFromString(L"{557CF400-1A04-11D3-9A73-0000F81EF32E}", &bmpClsid);
bitmap->Save(outputPath, &bmpClsid, NULL);
// 清理资源
delete bitmap;
ShutdownGDIPlus(token);
}
int main() {
// 调用函数
RotateImageRight90(L"D:\\path\\to\\input.bmp", L"D:\\path\\to\\output.bmp");
return 0;
}
GdiplusStartup
和GdiplusShutdown
来管理GDI+资源。Bitmap
类从文件加载图像,并使用Save
方法保存旋转后的图像。RotateFlip
方法用于旋转图像。Rotate90FlipNone
参数表示图像向右旋转90度,不进行翻转。确保在实际应用中正确设置文件路径,并处理可能的错误(例如文件不存在或读取错误)。
//
// CStringA转CStringW
//
CStringW CStrA2CStrW(const CStringA& cstrSrcA)
{
int len = MultiByteToWideChar(CP_ACP, 0, LPCSTR(cstrSrcA), -1, NULL, 0);
wchar_t* wstr = new wchar_t[len];
memset(wstr, 0, len * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, LPCSTR(cstrSrcA), -1, wstr, len);
CStringW cstrDestW = wstr;
delete[] wstr;
return cstrDestW;
}
//
// CStringW转CStringA
//
CStringA CStrW2CStrA(const CStringW& cstrSrcW)
{
int len = WideCharToMultiByte(CP_ACP, 0, LPCWSTR(cstrSrcW), -1, NULL, 0, NULL, NULL);
char* str = new char[len];
memset(str, 0, len);
WideCharToMultiByte(CP_ACP, 0, LPCWSTR(cstrSrcW), -1, str, len, NULL, NULL);
CStringA cstrDestA = str;
delete[] str;
return cstrDestA;
}
在Windows编程中,经常需要在WCHAR
(宽字符,通常用于Unicode字符串)和CHAR
(单字节字符,通常用于ANSI字符串)之间进行转换。以下是两个函数,分别用于实现这两种转换:
#include
void WCHARToCHAR(const WCHAR* input, CHAR* output, int outputSize) {
// 使用WideCharToMultiByte函数进行转换
WideCharToMultiByte(CP_ACP, 0, input, -1, output, outputSize, NULL, NULL);
}
#include
void CHARToWCHAR(const CHAR* input, WCHAR* output, int outputSize) {
// 使用MultiByteToWideChar函数进行转换
MultiByteToWideChar(CP_ACP, 0, input, -1, output, outputSize);
}
int main() {
// WCHAR 到 CHAR
WCHAR wText[] = L"Hello, World!";
CHAR cText[50];
WCHARToCHAR(wText, cText, sizeof(cText));
printf("Converted to CHAR: %s\n", cText);
// CHAR 到 WCHAR
CHAR aText[] = "Hello, World!";
WCHAR wConvertedText[50];
CHARToWCHAR(aText, wConvertedText, sizeof(wConvertedText)/sizeof(wConvertedText[0]));
wprintf(L"Converted to WCHAR: %ls\n", wConvertedText);
return 0;
}
WideCharToMultiByte
和 MultiByteToWideChar
是Windows API中用于字符编码转换的函数。CP_ACP
(ANSI Code Page),它表示当前系统的默认Windows ANSI代码页。如果需要支持全球语言字符,可以考虑使用CP_UTF8
。