MFC C++ BMP图片向右旋转90度示例函数 WCHAR与CHAR互转 CStringW CStringA互转

2024-06-18 05:44

本文主要是介绍MFC C++ BMP图片向右旋转90度示例函数 WCHAR与CHAR互转 CStringW CStringA互转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在MFC中,可以使用GDI+库来实现图像的旋转。以下是一个示例函数,展示如何将BMP图像向右旋转90度。首先,确保在项目中包含GDI+库,并在项目设置中添加#include <gdiplus.h>#pragma comment(lib, "gdiplus.lib")

#include <windows.h>
#include <gdiplus.h>
#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;
}

说明:

  1. 初始化和关闭GDI+:使用GdiplusStartupGdiplusShutdown来管理GDI+资源。
  2. 加载和保存图像:使用Bitmap类从文件加载图像,并使用Save方法保存旋转后的图像。
  3. 旋转图像RotateFlip方法用于旋转图像。Rotate90FlipNone参数表示图像向右旋转90度,不进行翻转。
  4. CLSID:用于指定保存图像的格式,这里使用的是BMP格式的CLSID。

确保在实际应用中正确设置文件路径,并处理可能的错误(例如文件不存在或读取错误)。

CStringW CStringA互转

//
// 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;
}

WCHAR与CHAR互转

在Windows编程中,经常需要在WCHAR(宽字符,通常用于Unicode字符串)和CHAR(单字节字符,通常用于ANSI字符串)之间进行转换。以下是两个函数,分别用于实现这两种转换:

1. WCHAR 到 CHAR 的转换

#include <windows.h>void WCHARToCHAR(const WCHAR* input, CHAR* output, int outputSize) {// 使用WideCharToMultiByte函数进行转换WideCharToMultiByte(CP_ACP, 0, input, -1, output, outputSize, NULL, NULL);
}

2. CHAR 到 WCHAR 的转换

#include <windows.h>void CHARToWCHAR(const CHAR* input, WCHAR* output, int outputSize) {// 使用MultiByteToWideChar函数进行转换MultiByteToWideChar(CP_ACP, 0, input, -1, output, outputSize);
}

使用示例

int main() {// WCHAR 到 CHARWCHAR wText[] = L"Hello, World!";CHAR cText[50];WCHARToCHAR(wText, cText, sizeof(cText));printf("Converted to CHAR: %s\n", cText);// CHAR 到 WCHARCHAR aText[] = "Hello, World!";WCHAR wConvertedText[50];CHARToWCHAR(aText, wConvertedText, sizeof(wConvertedText)/sizeof(wConvertedText[0]));wprintf(L"Converted to WCHAR: %ls\n", wConvertedText);return 0;
}

注意事项

  • 转换函数WideCharToMultiByteMultiByteToWideChar 是Windows API中用于字符编码转换的函数。
  • 代码页:这里使用的是CP_ACP(ANSI Code Page),它表示当前系统的默认Windows ANSI代码页。如果需要支持全球语言字符,可以考虑使用CP_UTF8
  • 输出缓冲区大小:确保为输出字符串分配足够的空间,以避免缓冲区溢出。
  • 错误处理:在实际应用中,应检查这些函数的返回值以处理可能的错误(例如,当输出缓冲区太小或输入字符串包含无法转换的字符时)。

这篇关于MFC C++ BMP图片向右旋转90度示例函数 WCHAR与CHAR互转 CStringW CStringA互转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071455

相关文章

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

C#中的 StreamReader/StreamWriter 使用示例详解

《C#中的StreamReader/StreamWriter使用示例详解》在C#开发中,StreamReader和StreamWriter是处理文本文件的核心类,属于System.IO命名空间,本... 目录前言一、什么是 StreamReader 和 StreamWriter?1. 定义2. 特点3. 用

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使