当前位置: 首页 > news >正文

实现源图像到目标图像的转换(提示: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;
}```
http://www.lryc.cn/news/583888.html

相关文章:

  • Redis数据库基础
  • JSZip 使用详解
  • vue3 td 标签优化时间显示
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DoubleVerticalSlider(双垂直滑块)
  • JavaScript 树形菜单总结
  • SoC程序如何使用单例模式运行
  • vue3 el-table 列汉字 排序时排除 null 或空字符串的值
  • 第二章-AIGC入门-AI视频生成:几款实用AI视频生成工具全解析(7/36)
  • 2025年软件测试面试题,精选33道,附答案
  • 数据结构笔记10:排序算法
  • 【办公类-107-01】20250710视频慢速与视频截图
  • 用OpenCV标定相机内参应用示例(C++和Python)
  • window显示驱动开发—XR_BIAS 和 PresentDXGI
  • 图像亮度调整的简单实现
  • 0基础学Python系列【31】 详细讲解Python中SQLAlchemy包的用法:从入门到精通
  • k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper
  • zookeeper etcd区别
  • 在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
  • macOS 上安装 Miniconda + Conda-Forge
  • 算法练习5-原地移除数组中所有的元素
  • 龙迅#LT8619B适用于HDMI转LVDS/RGB,芯片支持视频图像处理,OSD功能.
  • MacOS 终端(Terminal)配置显示日期时间
  • 在Docker中运行macOS的超方便体验!
  • 基于深度学习的自动调制识别网络(持续更新)
  • 【PTA数据结构 | C语言版】顺序队列的3个操作
  • 在 Mac 上使用 Git 拉取项目:完整指南
  • 【macos用镜像站体验】Claude Code入门使用教程和常用命令
  • 029_构造器重载与默认构造器
  • 基于多模态感知的裂缝2D及3D检测方案
  • 【leetcode】2236. 判断根节点是否等于子节点之和