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

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);

相关文章:

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

文章目录 核心功能特点局限性与替代方案常用方法构造函数从数组创建图像访问属性访问像素点Windows平台支持 常用方法迁移至OpenCV CxImage 是一款功能强大的图像处理类库&#xff0c;主要用于 Windows 平台的图像处理任务。它支持多种图像格式的加载、保存、编辑及特效处理&am…...

linux系统与shell 笔记

Linux 系统 Linux 是一种开源的操作系统内核&#xff0c;基于 Unix 设计&#xff0c;具有多用户、多任务、高稳定性和安全性的特点。它广泛应用于服务器、嵌入式设备和个人计算机领域。Linux 系统的核心组件包括内核、系统库、工具链和用户界面&#xff08;如命令行或图形界面…...

尚硅谷redis7 86 redis集群分片之3主3从集群搭建

86 redis集群分片之3主集群搭建 3主3从redis集群配置 找3台真实虚拟机,各自新建 mķdir -p /myredis/cluster 新建6个独立的redis实例服务 IP:192.168.111.175端口6381/端口6382 vim /myredis/cluster/redisCluster6381.conf bind 0.0.0.0 daemonize yes protected-mode no …...

Kaggle-Predict Calorie Expenditure-(回归+xgb+cat+lgb+模型融合+预测结果)

Predict Calorie Expenditure 题意&#xff1a; 给出每个人的基本信息&#xff0c;预测运动后的卡路里消耗值。 数据处理&#xff1a; 1.构造出人体机能、运动相关的特征值。 2.所有特征值进行从新组合&#xff0c;注意唯独爆炸 3.对连续信息分箱变成离散 建立模型&#x…...

【解决办法】Git报错error: src refspec main does not match any.

在命令行中使用 Git 进行 git push -u origin main 操作时遇到报错error: src refspec main does not match any。另一个错误信息是&#xff1a;error: failed to push some refs to https://github.com/xxx/xxx.git.这是在一个新设备操作时遇到的问题&#xff0c;之前没有注意…...

React与Vue的内置指令对比

React 与 Vue 在内置指令的设计理念和实现方式上有显著差异。Vue 提供了一套丰富的模板指令系统&#xff0c;而 React 更倾向于通过原生 JavaScript 语法和 JSX 实现类似功能。以下是两者的核心对比&#xff1a; 一、条件渲染 Vue 使用 “v-if”/ “v-else” 指令&#xff0c;…...

2025年5月24号高项综合知识真题以及答案解析(第1批次)

2025年5月24号高项综合知识真题以及答案解析...

【NATURE氮化镓】GaN超晶格多沟道场效应晶体管的“闩锁效应”

2025年X月X日,布里斯托大学的Akhil S. Kumar等人在《Nature Electronics》期刊发表了题为《Gallium nitride multichannel devices with latch-induced sub-60-mV-per-decade subthreshold slopes for radiofrequency applications》的文章,基于AlGaN/GaN超晶格多通道场效应晶…...

Ubuntu24.04换源方法(新版源更换方式,包含Arm64)

一、源文件位置 Ubuntu24.04的源地址配置文件发生改变&#xff0c;不再使用以前的sources.list文件&#xff0c;升级24.04之后&#xff0c;而是使用如下文件 /etc/apt/sources.list.d/ubuntu.sources二、开始换源 1. 备份源配置文件 sudo cp /etc/apt/sources.list.d/ubunt…...

26 C 语言函数深度解析:定义与调用、返回值要点、参数机制(值传递)、原型声明、文档注释

1 函数基础概念 1.1 引入函数的必要性 在《街霸》这类游戏中&#xff0c;实现出拳、出脚、跳跃等动作&#xff0c;每项通常需编写 50 - 80 行代码。若每次调用都重复编写这些代码&#xff0c;程序会变得臃肿不堪&#xff0c;代码可读性与维护性也会大打折扣。 为解决这一问题&…...

彻底理解一个知识点的具体步骤

文章目录 前言一、了解概念&#xff08;是什么&#xff09;二、理解原理&#xff08;为什么&#xff09;三、掌握方法&#xff08;怎么用&#xff09; 四、动手实践&#xff08;会用&#xff09;五、类比拓展&#xff08;迁移能力&#xff09;六、总结归纳&#xff08;融会贯通…...

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制

FFmpeg 时间戳回绕处理&#xff1a;保障流媒体时间连续性的核心机制 一、回绕处理函数 /** * Wrap a given time stamp, if there is an indication for an overflow * * param st stream // 传入一个指向AVStream结构体的指针&#xff0c;代表流信息 * pa…...

yolov8改进模型

YOLOv8 作为当前 YOLO 系列的最新版本&#xff0c;已经具备出色的性能。若要进一步改进&#xff0c;可以从网络架构优化、训练策略增强、多任务扩展和部署效率提升四个方向入手。以下是具体改进思路和实现示例&#xff1a; 1. 网络架构优化 (1) 骨干网络增强 引入 Transform…...

PostgreSQL日常运维

目录 一、PostgreSQL基础操作 1.1 登录数据库 1.2 数据库管理 1.3 数据表操作 二、数据备份与恢复 2.1 备份工具pg_dump 2.2 恢复工具pg_restore与psql 2.3 备份策略建议 三、模式&#xff08;Schema&#xff09; 3.1 模式的核心作用 3.2 模式操作全流程 四、远程连…...

<< C程序设计语言第2版 >> 练习 1-23 删除C语言程序中所有的注释语句

1. 前言 本篇文章介绍的是实现删除C语言源文件中所有注释的功能.希望可以给C语言初学者一点参考.代码测试并不充分, 所以肯定还有bug, 有兴趣的同学可以改进. 原题目是: 练习1-23 编写一个删除C语言程序中所有的注释语句. 要正确处理带引号的字符串与字符常量. 在C语言中, 注释…...

Fluence (FLT) 2026愿景:RWA代币化加速布局AI算力市场

2025年5月29日&#xff0c;苏黎世 - Fluence&#xff0c;企业级去中心化计算平台&#xff0c;荣幸地揭开其2026愿景的面纱&#xff0c;并宣布将于6月1日起启动四大新举措。 Fluence 成功建立、推出并商业化了其去中心化物理基础设施计算网络&#xff08;DePIN&#xff09;&…...

如何撰写一篇优质 Python 相关的技术文档 进阶指南

&#x1f49d;&#x1f49d;&#x1f49d;在 Python 项目开发与协作过程中&#xff0c;技术文档如同与团队沟通的桥梁&#xff0c;能极大提高工作效率。但想要打造一份真正实用且高质量的 Python 技术文档类教程&#xff0c;并非易事&#xff0c;需要在各个环节深入思考与精心打…...

选择if day5

5.scanf&#xff08;“空白符”&#xff09; 空白符作用表示匹配任意多个空白符 进入了内存缓冲区&#xff08;本质就是一块内存空间&#xff09; 6.scanf读取问题&#xff1a; a.遇到非法字符读取结束 2. %*d * 可以跳过一个字符 eg&#xff1a;%d%*d%d 读取第一和第三个字符…...

MiniMax V-Triune让强化学习(RL)既擅长推理也精通视觉感知

MiniMax 近日在github上分享了技术研究成果——V-Triune&#xff0c;这次MiniMax V-Triune的发布既是AI视觉技术也是应用工程上的一次“突围”&#xff0c;让强化学习&#xff08;RL&#xff09;既擅长推理也精通视觉感知&#xff0c;其实缓解了传统视觉RL“鱼和熊掌不可兼得”…...

Hash 的工程优势: port range 匹配

昨天和朋友聊到 “如何匹配一个 port range”&#xff0c;觉得挺有意思&#xff0c;简单写篇散文。 回想起十多年前&#xff0c;我移植并优化了 nf-HiPAC&#xff0c;当时还看不上 ipset hash&#xff0c;后来大约七八年前&#xff0c;我又舔 nftables&#xff0c;因为用它可直…...

同为.net/C#的跨平台运行时的mono和.net Core有什么区别?

Mono 和 .NET Core&#xff08;现已统一为 .NET&#xff09;都是 .NET 生态的跨平台实现&#xff0c;但它们在设计目标、技术特性和应用场景上有显著区别。以下是详细对比&#xff1a; ​​1. 历史背景​​ ​​项目​​​​诞生时间​​​​开发者​​​​当前状态​​​​Mo…...

前端安全直传MinIO方案

目的&#xff1a;前端直接上传文件到Minio&#xff0c;不通过服务器中转文件。密钥不能在前端明文传输。 ## 一、架构设计 mermaid sequenceDiagram 前端->>后端: 1.请求上传凭证 后端->>MinIO: 2.生成预签名URL 后端-->>前端: 3.返回预签名URL 前端->…...

HackMyVM-Dejavu

信息搜集 主机发现 ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:39:60:4c, IPv4: 192.168.43.126 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.43.1 c6:45:66:05:91:88 …...

LeetCode Hot100(动态规划)

70. 爬楼梯 题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 题解&#xff1a; 不难发现&#xff0c;每一次都是从i-1或者i-2爬上来的&#xff0c;我们加起来求和即可 class So…...

Opencv实用操作5 图像腐蚀膨胀

相关函数 腐蚀函数 img1_erosion cv2.erode(img1,kernel,iterations1) &#xff08;图片&#xff0c;卷积核&#xff0c;次数&#xff09; 膨胀函数 img_dilate cv2.dilate(img2,kernel1,iterations1) &#xff08;图片&#xff0c;卷积核&#xff0c;次数&#xff09;…...

【赵渝强老师】OceanBase的部署架构

OceanBase数据库支持无共享&#xff08;Shared-Nothing&#xff0c;SN&#xff09;模式和共享存储&#xff08;Shared-Storage&#xff0c;SS&#xff09;模式两种部署架构。 一、 无共享&#xff08;Shared-Nothing&#xff0c;SN&#xff09;模式 在SN模式下&#xff0c;各…...

(18)混合云架构部署

文章目录 &#x1f680; 混合云架构部署&#xff1a;Java应用的云原生之旅&#x1f329;️ 混合云架构简介⚡ Java应用云原生部署五大核心技术1️⃣ 容器化与编排技术2️⃣ 服务网格与API网关3️⃣ CI/CD自动化流水线4️⃣ 多云管理平台5️⃣ 云原生Java框架与运行时 &#x1f…...

c/c++的opencv霍夫变换

OpenCV中的霍夫变换 (C/C) Hough Transform 霍夫变换 (Hough Transform) 是一种在图像分析中用于检测几何形状&#xff08;如直线、圆形等&#xff09;的特征提取技术。它通过一种投票机制在参数空间中寻找特定形状的实例。OpenCV 库为 C 开发者提供了强大且易用的霍夫变换函数…...

AAOS系列之(七) --- AudioRecord录音逻辑分析(一)

一文讲透AAOS架构&#xff0c;点到为止不藏私 &#x1f4cc; 这篇帖子给大家分析下 AudioRecord的初始化 1. 场景介绍: 在 AAOS 的 Framework 开发中&#xff0c;录音模块几乎是每个项目都会涉及的重要组成部分。无论是语音控制、车内对讲&#xff08;同行者模式&#xff09;…...

MySQL大表结构变更利器:pt-online-schema-change原理与实战指南

MySQL大表结构变更利器:pt-online-schema-change原理与实战指南 MySQL数据库运维中,最令人头疼的问题之一莫过于对大表进行结构变更(DDL操作)。传统的ALTER TABLE操作会锁表,导致业务长时间不可用,这在724小时运行的互联网业务中是不可接受的。本文将深入剖析Percona To…...