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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84973.shtml
英文地址,請注明出處:http://en.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 屏幕的一部分并將其自動復制到剪…