实现源图像到目标图像的转换(提示:RGB值互换,新R=旧G,新G=旧B,新B=旧R)
1、实现源图像到目标图像的转换
源图像2a.jpg :
目标图像2b.jpg:
提示:RGB值互换,新R=旧G,新G=旧B,新B=旧R
// main.cpp : 直接运行的 CImage RGB 通道循环置换示例
// VS2022 /MT 或 /MD 均可编译#include <windows.h> // WinAPI 基础
#include <atlbase.h> // ATL 支撑
#include <atlimage.h> // CImage
#include <gdiplus.h> // GDI+ 初始化
#include <iostream>#pragma comment(lib, "gdiplus.lib") // 链接 GDI+using namespace Gdiplus;// RGB 置换函数:newR = oldG, newG = oldB, newB = oldR
bool SwapRGBChannels(const CImage& src, CImage& dst)
{int bpp = src.GetBPP();if (bpp != 24 && bpp != 32) {std::wcerr << L"仅支持 24/32 bpp 图像\n";return false;}int w = src.GetWidth();int h = src.GetHeight();if (FAILED(dst.Create(w, h, bpp))) {std::wcerr << L"创建目标图像失败\n";return false;}bool hasAlpha = (bpp == 32);for (int y = 0; y < h; ++y) {BYTE* pSrc = reinterpret_cast<BYTE*>(const_cast<void*>(src.GetPixelAddress(0, y)));BYTE* pDst = static_cast<BYTE*>(dst.GetPixelAddress(0, y));for (int x = 0; x < w; ++x) {BYTE oldB = pSrc[0];BYTE oldG = pSrc[1];BYTE oldR = pSrc[2];pDst[0] = oldR; // newBpDst[1] = oldB; // newGpDst[2] = oldG; // newRif (hasAlpha) pDst[3] = pSrc[3];pSrc += hasAlpha ? 4 : 3;pDst += hasAlpha ? 4 : 3;}}return true;
}int wmain()
{// 1. 启动 GDI+GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken = 0;if (GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, nullptr) != Ok) {std::wcerr << L"GDI+ 初始化失败\n";return -1;}// 2. 载入原图CImage src, dst;if (FAILED(src.Load(L"2a.jpg"))) {std::wcerr << L"无法加载 input.jpg\n";GdiplusShutdown(gdiplusToken);return -1;}// 3. RGB 通道置换if (!SwapRGBChannels(src, dst)) {std::wcerr << L"通道置换失败\n";GdiplusShutdown(gdiplusToken);return -1;}// 4. 保存结果if (FAILED(dst.Save(L"2b.jpg"))) {std::wcerr << L"保存 2b.jpg 失败\n";GdiplusShutdown(gdiplusToken);return -1;}std::wcout << L"处理完成,结果已保存为 2b.jpg\n";// 5. 清理GdiplusShutdown(gdiplusToken);return 0;
}```