C++ 图像处理库 CxImage 简介 (迁移至OpenCV)

文章目录

  • 核心功能特点
  • 局限性与替代方案
  • 常用方法
    • 构造函数
    • 从数组创建图像
    • 访问属性
    • 访问像素点
    • Windows平台支持
  • 常用方法迁移至OpenCV


CxImage 是一款功能强大的图像处理类库,主要用于 Windows 平台的图像处理任务。它支持多种图像格式的加载、保存、编辑及特效处理,在早期的 Windows 应用开发中较为常见,尤其是在需要处理图像的桌面应用程序中。

源码下载 :https://sourceforge.net/projects/cximage/files/7.02/cximage702_full.7z/download
编译使用:Win32图片库CxImage在vs2022下的编译和使用

核心功能特点

  • 多格式支持:
    • 支持 BMP、JPEG、PNG、GIF、TIFF、ICO、WMF、EMF 等常见图像格式的读写操作。
    • 可处理动画 GIF、多帧图像等特殊格式。
  • 图像处理能力:
    • 基础操作:缩放、旋转、裁剪、翻转、镜像等。
    • 像素级编辑:调整亮度、对比度、饱和度,支持色彩空间转换(如 RGB 与 HSV 互转)。
    • 特效处理:模糊、锐化、边缘检测、浮雕、素描等滤镜效果。
    • 图像变换:透视变换、扭曲变形等几何操作。
  • 实用功能:
    • 图像叠加与混合:支持 alpha 通道处理,实现图像透明叠加。
    • 缩略图生成:可快速生成指定尺寸的缩略图,保持比例或强制缩放。
    • 图像信息获取:读取图像分辨率、色彩深度、文件大小等元数据。
  • Windows平台的特殊支持
    • 可以直接与DC交互。

局限性与替代方案

  • 局限性:
    • 仅支持 Windows 平台,跨平台兼容性差。
    • 开发维护逐渐停滞,对新图像格式(如 WebP、HEIC)支持有限。
    • 相比现代图像处理库,性能和内存管理存在优化空间。
  • 现代替代方案:
    • OpenCV:跨平台、功能全面的计算机视觉库,支持深度学习集成。
    • libpng/libjpeg/tiff:专注于单一格式处理的底层库,稳定性高。
    • Qt Image Processing:Qt 框架内置的图像处理模块,适合 Qt 应用开发。
    • Magick++:ImageMagick 的 C++ 封装,支持丰富的图像特效与批处理。

常用方法

构造函数

CxImage(uint32_t imagetype = 0);
CxImage(uint32_t dwWidth, uint32_t dwHeight, uint32_t wBpp, uint32_t imagetype = 0);
CxImage(const CxImage &src, bool copypixels = true, bool copyselection = true, bool copyalpha = true);

从数组创建图像

bool	CreateFromArray(uint8_t* pArray,uint32_t dwWidth,uint32_t dwHeight,uint32_t dwBitsperpixel, uint32_t dwBytesperline, bool bFlipImage);
bool	CreateFromMatrix(uint8_t** ppMatrix,uint32_t dwWidth,uint32_t dwHeight,uint32_t dwBitsperpixel, uint32_t dwBytesperline, bool bFlipImage);

访问属性


/** \addtogroup Attributes */ //@{int32_t		GetSize();uint8_t*	GetBits(uint32_t row = 0);uint8_t		GetColorType();void*		GetDIB() const;uint32_t	GetHeight() const;uint32_t	GetWidth() const;uint16_t	GetBpp() const;uint32_t	GetType() const;const char*	GetLastError();void	GetOffset(int32_t *x,int32_t *y);void	SetOffset(int32_t x,int32_t y);

访问像素点

/** \addtogroup Pixel */ //@{bool	IsInside(int32_t x, int32_t y);bool	IsTransparent(int32_t x,int32_t y);bool	GetTransparentMask(CxImage* iDst = 0);RGBQUAD GetPixelColor(int32_t x,int32_t y, bool bGetAlpha = true);uint8_t	GetPixelIndex(int32_t x,int32_t y);uint8_t	GetPixelGray(int32_t x, int32_t y);void	SetPixelColor(int32_t x,int32_t y,RGBQUAD c, bool bSetAlpha = false);void	SetPixelColor(int32_t x,int32_t y,COLORREF cr);void	SetPixelIndex(int32_t x,int32_t y,uint8_t i);void	DrawLine(int32_t StartX, int32_t EndX, int32_t StartY, int32_t EndY, RGBQUAD color, bool bSetAlpha=false);void	DrawLine(int32_t StartX, int32_t EndX, int32_t StartY, int32_t EndY, COLORREF cr);void	BlendPixelColor(int32_t x,int32_t y,RGBQUAD c, float blend, bool bSetAlpha = false);bool	SetRectColor(int32_t left, int32_t top, int32_t right, int32_t bottom, RGBQUAD color, bool bSetAlpha = false);bool	SetRectColor(RECT& rect, RGBQUAD color, bool bSetAlpha = false);
//@}

Windows平台支持

#if CXIMAGE_SUPPORT_WINDOWSint32_t	Blt(HDC pDC, int32_t x=0, int32_t y=0);HBITMAP Draw2HBITMAP(HDC hdc, int32_t x, int32_t y, int32_t cx, int32_t cy, RECT* pClipRect, bool bSmooth);HBITMAP MakeBitmap(HDC hdc = NULL, bool bTransparency = false);HICON   MakeIcon(HDC hdc = NULL, bool bTransparency = false);HANDLE	CopyToHandle();bool	CreateFromHANDLE(HANDLE hMem);		//Windows objects (clipboard)bool	CreateFromHBITMAP(HBITMAP hbmp, HPALETTE hpal=0, bool bTransparency = false);	//Windows resourcebool	CreateFromHICON(HICON hico, bool bTransparency = false);int32_t	Draw(HDC hdc, int32_t x=0, int32_t y=0, int32_t cx = -1, int32_t cy = -1, RECT* pClipRect = 0, bool bSmooth = false, bool bFlipY = false);int32_t	Draw(HDC hdc, const RECT& rect, RECT* pClipRect=NULL, bool bSmooth = false, bool bFlipY = false);int32_t	Stretch(HDC hdc, int32_t xoffset, int32_t yoffset, int32_t xsize, int32_t ysize, uint32_t dwRop = SRCCOPY);int32_t	Stretch(HDC hdc, const RECT& rect, uint32_t dwRop = SRCCOPY);int32_t	Tile(HDC hdc, RECT *rc);int32_t	Draw2(HDC hdc, int32_t x=0, int32_t y=0, int32_t cx = -1, int32_t cy = -1);int32_t	Draw2(HDC hdc, const RECT& rect);//int32_t	DrawString(HDC hdc, int32_t x, int32_t y, const char* text, RGBQUAD color, const char* font, int32_t lSize=0, int32_t lWeight=400, uint8_t bItalic=0, uint8_t bUnderline=0, bool bSetAlpha=false);int32_t	DrawString(HDC hdc, int32_t x, int32_t y, const TCHAR* text, RGBQUAD color, const TCHAR* font, int32_t lSize=0, int32_t lWeight=400, uint8_t bItalic=0, uint8_t bUnderline=0, bool bSetAlpha=false);// <VATI> extensionsint32_t    DrawStringEx(HDC hdc, int32_t x, int32_t y, CXTEXTINFO *pTextType, bool bSetAlpha=false );void    InitTextInfo( CXTEXTINFO *txt );
protected:bool IsHBITMAPAlphaValid( HBITMAP hbmp );
public:
#endif //CXIMAGE_SUPPORT_WINDOWS
//@}// file operations
#if CXIMAGE_SUPPORT_DECODE
/** \addtogroup Decode */ //@{
#ifdef WIN32//bool Load(LPCWSTR filename, uint32_t imagetype=0);bool LoadResource(HRSRC hRes, uint32_t imagetype, HMODULE hModule=NULL);
#endif

常用方法迁移至OpenCV

CxImage创建图像

CxImage* mpCxImage; 
mpCxImage->CreateFromArray(pArray, width, height, BitCount, dwBytesPerLine, TRUE);

OpenCV创建图像

cv::Mat	  mCvImage;
mCvImage = cv::Mat(height, width, CV_8UC3, pArray);

CxImage访问像素

RGBQUAD rgb = mpCxImage->GetPixelColor(pt.x, pt.y, false);
mpCxImage->SetPixelColor((int32_t)logicPt.x, (int32_t)logicPt.y, refColor);

OpenCV访问像素

RGBQUAD rgb;
const cv::Vec3b& pixel = mCvImage.at<cv::Vec3b>(pt.y, pt.x);
rgb.rgbBlue = pixel[0];
rgb.rgbGreen = pixel[1];
rgb.rgbRed = pixel[2];cv::Vec3b& pixel = mCvImage.at<cv::Vec3b>(pt.Y, pt.X);
pixel[0] = GetBValue(refColor);
pixel[1] = GetGValue(refColor);
pixel[2] = GetRValue(refColor);

CxImage绘制文字

CxImage::CXTEXTINFO info;
mpCxImage->InitTextInfo(&info);
_stprintf(info.lfont.lfFaceName, _T("Times New Roman"));
info.lfont.lfCharSet = GB2312_CHARSET;
info.lfont.lfHeight = 10;
info.fcolor = rgb;
info.opaque = 0;
sprintf_s(info.text, "%s", strinfo.c_str());//Y方向要镜像
mpCxImage->DrawStringEx(0, (int32_t)logicPt.x, GetHeight() - (int32_t)logicPt.y, &info);

OpenCV绘制文字

// 绘制文本
COLORREF rgb = theApp.GetMainFrame().GetImageMeasureTextColor();
cv::Scalar bgr = cv::Scalar(GetBValue(rgb), GetGValue(rgb), GetRValue(rgb));
cv::putText(mCvImage,strinfo,cv::Point(sOutput.ShowPt[i].X, sOutput.ShowPt[i].Y),cv::FONT_HERSHEY_SIMPLEX,0.4,bgr,1,cv::LINE_AA);// 绘制文本背景
cv::rectangle(mCvImage,pos + cv::Point(0, baseline),pos + cv::Point(textSize.width, -textSize.height),bgr,cv::FILLED);

CxImage绘制到DC

mpCxImage->Draw(dc.GetSafeHdc(), CRect(pos.x - imageWidth / 2, pos.y - imageHeight / 2, pos.x + imageWidth / 2, pos.y + imageHeight / 2), NULL, IsSmoothMode());

OpenCV绘制到DC

//if (IsSmoothMode()) {
//	cv::resize(originalImage, resizedImage, cv::Size(imageWidth, imageHeight), 0, 0, cv::INTER_LINEAR);
//}
//else {
//	cv::resize(originalImage, resizedImage, cv::Size(imageWidth, imageHeight), 0, 0, cv::INTER_NEAREST);
//}
// 禁用GDI的平滑,因为已在OpenCV处理
Draw(dc.GetSafeHdc(), CRect(pos.x - imageWidth / 2, pos.y - imageHeight / 2, pos.x + imageWidth / 2, pos.y + imageHeight / 2), IsSmoothMode());// 转换为 BGRA 格式(兼容 GDI 的 Alpha 混合)
cv::Mat bgraImage;
switch (mCvImage.channels()) {case 1: cv::cvtColor(mCvImage, bgraImage, cv::COLOR_GRAY2BGRA); break;case 3: cv::cvtColor(mCvImage, bgraImage, cv::COLOR_BGR2BGRA);  break;case 4: bgraImage = mCvImage.clone();                           break;default: return false;
}// 创建 BITMAPINFO 结构
BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bgraImage.cols;
bi.biHeight = -bgraImage.rows;  // 负值表示从上到下布局
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;// 设置缩放模式
SetStretchBltMode(hdc, smooth ? HALFTONE : COLORONCOLOR);
SetBrushOrgEx(hdc, 0, 0, NULL);  // HALFTONE 模式需要重置原点// 绘制图像
int result = StretchDIBits(hdc,destRect.left, destRect.top,      // 目标左上角destRect.Width(), destRect.Height(), // 目标尺寸0, 0,                            // 源图像起点bgraImage.cols, bgraImage.rows,   // 源图像尺寸bgraImage.data,                   // 图像数据(BITMAPINFO*)&bi,                 // BITMAPINFODIB_RGB_COLORS,                   // 颜色格式SRCCOPY                           // 直接拷贝);

CxImage从资源ID读取图像

//bool LoadResource(HRSRC hRes, uint32_t imagetype, HMODULE hModule=NULL);
mCxImage.LoadResource(FindResource(hModule, MAKEINTRESOURCE(IDB_xxxxxx), _T("PNG")), 0);

OpenCV从资源ID读取图像

// 替换为你的资源ID,例如 IDB_PNG1
HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(IDB_xxxxxx), _T("PNG"));
if (!hResource) {// 资源未找到return;
}DWORD imageSize = SizeofResource(hModule, hResource);
HGLOBAL hMemory = LoadResource(hModule, hResource);
if (!hMemory) {// 加载资源失败return;
}void* pData = LockResource(hMemory);
if (!pData) {// 锁定资源失败return;
}// 复制到 std::vector<uchar> 中
std::vector<uchar> buffer((uchar*)pData, (uchar*)pData + imageSize);// 使用 OpenCV 解码图像
cv::Mat image = cv::imdecode(buffer, cv::IMREAD_UNCHANGED);
if (image.empty()) {// 图像解码失败return;
}// 现在你可以使用 image 进行后续操作
cv::imshow("Loaded Image", image);
cv::waitKey(0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博客系统】博客系统第十一弹:从零开始在 Linux 系统上搭建 Java 部署环境并部署 Web 项目

搭建 Java 部署环境 JDK 1. 更新软件包 apt 命令详细介绍 sudo apt-get update2. 安装 OpenJDK 查找 JDK 包 apt list | grep "jdk"安装 JDK sudo apt install openjdk-17-jdk注意&#xff1a; 此处安装的是 OpenJDK&#xff0c;OpenJDK 是一个开源版本的 JDK&am…

智能外呼系统中 NLP 意图理解的工作原理与技术实现

智能外呼系统通过整合语音识别&#xff08;ASR&#xff09;、自然语言处理&#xff08;NLP&#xff09;和语音合成&#xff08;TTS&#xff09;等技术&#xff0c;实现了自动化的电话交互。其中&#xff0c;NLP 意图理解是核心模块&#xff0c;负责解析用户话语中的语义和意图&…

Sigma-Aldrich胰蛋白酶细胞解离方案速览

Sigma-Aldrich_胰蛋白酶用于细胞培养 细胞解离是细胞传代过程中的一个步骤&#xff0c;即细胞从预处理表面分离&#xff0c;形成悬浮液。这些悬浮液对于传代培养重新接种、细胞计数分析和细胞增殖非常重要。有多种蛋白水解酶可用来从粘附基质上脱离细胞&#xff0c;胰蛋白酶就…

宝塔安装WordPress程序

宝塔安装WordPress程序 一、提前准备1&#xff0c;下载WordPress2&#xff0c;在宝塔创建站点 二、部署项目1&#xff0c;上传下载的wordpress压缩包至创建的项目根目录下并解压 三、wordpress安装1&#xff0c;在浏览器打开创建的网站2&#xff0c;开始按照流程安装配置数据库…

【LangChain】框架解析

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心架构图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…

百度之星2024 初赛第一场 补给

百度之星2024 初赛第一场 补给 题干描述问题分析&#xff1a;C代码Java代码&#xff1a;Python代码补充说明&#xff1a; 题干描述 参考自马蹄集OJ&#xff0c;原文链接1 可怕的战争发生了&#xff0c;小度作为后勤保障工作人员&#xff0c;也要为了保卫国家而努力。 现在有 …

JavaScripts console.log和console.dir区别

console.log 和 console.dir 都是 JavaScript 中用于在浏览器控制台打印信息的方法 &#xff0c;二者主要有以下区别&#xff1a; 输出内容和格式 console.log&#xff1a;主要用于输出简单的日志信息&#xff0c;直接打印数据的字符串表示 。对于对象、数组等引用类型&#…

uniapp 开发企业微信小程序时,如何在当前页面真正销毁前或者关闭小程序前调用一个api接口

在 UniApp 开发企业微信小程序时&#xff0c;若需在页面销毁或小程序关闭前调用 API 接口&#xff0c;需结合页面生命周期和应用生命周期实现。以下是具体实现方案及注意事项&#xff1a; 一、在页面销毁前调用 API&#xff08;页面级&#xff09; 通过页面生命周期钩子 onUnl…

聊聊 Metasploit 免杀

各位小伙伴们&#xff0c;晚上好&#xff01; 咱们今天打开宵夜“安全食材箱”&#xff0c;聊聊渗透测试绕过杀毒&#xff08;免杀&#xff09;的那些门道。你可以把免杀理解为——深夜做宵夜时&#xff0c;家里有人睡觉&#xff0c;但你非得去厨房整点美食&#xff0c;还不能…

Android高级开发第二篇 - JNI 参数传递与 Java → C → Java 双向调用

文章目录 Android高级开发第二篇 - JNI 参数传递与 Java → C → Java 双向调用引言JNI基础回顾JNI中的参数传递基本数据类型传递字符串传递数组传递对象传递 Java → C → Java 双向调用从C/C调用Java方法实现一个完整的回调机制 内存管理与注意事项性能优化提示结论参考资源 …

2025-05-28 Python深度学习8——优化器

文章目录 1 工作原理2 常见优化器2.1 SGD2.2 Adam 3 优化器参数4 学习率5 使用最佳实践 本文环境&#xff1a; Pycharm 2025.1Python 3.12.9Pytorch 2.6.0cu124 ​ 优化器 (Optimizer) 是深度学习中的核心组件&#xff0c;负责根据损失函数的梯度来更新模型的参数&#xff0c;使…

Web攻防-SQL注入增删改查HTTP头UAXFFRefererCookie无回显报错

知识点&#xff1a; 1、Web攻防-SQL注入-操作方法&增删改查 2、Web攻防-SQL注入-HTTP头&UA&Cookie 3、Web攻防-SQL注入-HTTP头&XFF&Referer 案例说明&#xff1a; 在应用中&#xff0c;存在增删改查数据的操作&#xff0c;其中SQL语句结构不一导致注入语句…

Windows MongoDB C++驱动安装

MongoDB驱动下载 MongoDB 官网MongoDB C驱动程序入门MongoDB C驱动程序入门 安装环境 安装CMAKE安装Visual Studio 编译MongoDB C驱动 C驱动依赖C驱动&#xff0c;需要先编译C驱动 下载MongoDB C驱动源码 打开CMAKE(cmake-gui) 选择源码及输出路径,然后点击configure …

使用 C/C++ 和 OpenCV 调用摄像头

使用 C/C 和 OpenCV 调用摄像头 &#x1f4f8; OpenCV 是一个强大的计算机视觉库&#xff0c;它使得从摄像头捕获和处理视频流变得非常简单。本文将指导你如何使用 C/C 和 OpenCV 来调用摄像头、读取视频帧并进行显示。 准备工作 在开始之前&#xff0c;请确保你已经正确安装…

使用微软最近开源的WSL在Windows上优雅的运行Linux

install wsl https://github.com/microsoft/WSL/releases/download/2.4.13/wsl.2.4.13.0.x64.msi install any distribution from microsoft store, such as kali-linux from Kali office website list of distribution PS C:\Users\50240> wsl -l -o 以下是可安装的有…

Win11安装Dify

1、打开Virtual Machine Platform功能 电脑系统为&#xff1a;Windows 11 家庭中文版24H2版本。 打开控制面板&#xff0c;点击“程序”&#xff0c;点击“启用或关闭Windows功能”。 下图标记的“Virtual Machine Platform”、“适用于 Linux 的 Windows 子系统”、“Windows…

C++模板类深度解析与气象领域应用指南

支持开源&#xff0c;为了更好的后来者 ————————————————————————————————————————————————————By 我说的 C模板类深度解析与气象领域应用指南 一、模板类核心概念 1.1 模板类定义 模板类是C泛型编程的核心机制&#x…

MongoDB(七) - MongoDB副本集安装与配置

文章目录 前言一、下载MongoDB1. 下载MongoDB2. 上传安装包3. 创建相关目录 二、安装配置MongoDB1. 解压MongoDB安装包2. 重命名MongoDB文件夹名称3. 修改配置文件4. 分发MongoDB文件夹5. 配置环境变量6. 启动副本集7. 进入MongoDB客户端8. 初始化副本集8.1 初始化副本集8.2 添…

mac笔记本如何快捷键截图后自动复制到粘贴板

前提&#xff1a;之前只会进行部分区域截图操作&#xff08;commandshift4&#xff09;操作&#xff0c;截图后发现未自动保存在剪贴板&#xff0c;还要进行一步手动复制到剪贴板的操作。 mac笔记本如何快捷键截图后自动复制到粘贴板 截取 Mac 屏幕的一部分并将其自动复制到剪…