扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:陆其明 来源:hqtech.nease.net 2007年10月19日
关键字: DirectShow 视频 马赛克
图1 对人像面部进行马赛克处理前后的效果对比 |
图2 需要进行马赛克处理的区域 |
图3 R1区域的像素示意图 |
图4 R1区域经过马赛克处理后的像素示意图 |
// 图像帧数据指针 PBYTE pImage; // 获取图像数据 // … // 指向图像第1行开头的指针 PBYTE pImageTopLine = NULL; // 图像的跨度(以字节为单位) long imageStride = 0; // 如果图像数据是以从下往上的扫描顺序存储的, // 则图像的第1行应该在pImage数据的倒数第1行; // 如果图像数据是以从上往下的扫描顺序存储的, // 则图像的第1行就是pImage指的位置 if (m_bIsBottomUp) { imageStride = -m_nImageStride; pImageTopLine = pImage + m_nImageStride * (m_nImageHeight - 1); } else { imageStride = m_nImageStride; pImageTopLine = pImage; } // ratioX是水平方向上像素的放大倍数 // ratioY是垂直方向上像素的放大倍数 // maskStride为进行马赛克处理的区域的宽度(以字节为单位) /* macroWidth和macorHeight有如下计算关系: RECT m_MaskRect; // 需要进行马赛克处理的矩形区域(由用户指定) int maskWidth = m_MaskRect.right - m_MaskRect.left + 1; int maskHeight = m_MaskRect.bottom - m_MaskRect.top + 1; macroWidth = maskWidth / m_nRatioX; macroHeight = maskHeight / m_nRatioY; */ int macroWidth, macroHeight, maskStride, ratioX, ratioY; // 马赛克处理过程中: // pMaskPixel 指向当前像素, // pMaskLine指向当前行, // pMaskNextLine下一行 PBYTE pMaskTopLine, pMaskLine, pMaskNextLine, pMaskPixel; // pMaskTopLine指向需要进行马赛克处理的区域的第1行 // 注:m_nPixelBytes为单个像素占用的字节数 pMaskTopLine = pImageTopLine + m_MaskRect.top * imageStride + m_MaskRect.left * m_nPixelBytes; macroWidth = m_nMacroWidth; macroHeight = m_nMacroHeight; maskStride = m_nMaskStride; ratioX = m_nRatioX; ratioY = m_nRatioY; // 扫描指定区域的像素,进行马赛克处理… int cycle = 0; for (int i = 0; i < macroHeight; i++) { // 定位需要进行马赛克处理的当前行 pMaskLine = pMaskTopLine + i * ratioY * imageStride; // 定位需要进行马赛克处理的当前像素 pMaskPixel = pMaskLine; for (int j = 0; j < macroWidth; j++) { // 水平方向上进行像素放大 for (cycle = 0; cycle < ratioX - 1; cycle++) { // 将当前像素值复制给右边的下一个像素 memcpy(pMaskPixel+m_nPixelBytes, pMaskPixel, m_nPixelBytes); // 指向下一个像素 pMaskPixel += m_nPixelBytes; } // 指向下一个采样像素 pMaskPixel += m_nPixelBytes; } // 垂直方向上进行像素放大 for (cycle = 0; cycle < ratioY - 1; cycle++) { // 获得马赛克处理区域的下一行指针 pMaskNextLine = pMaskLine + imageStride; // 将马赛克处理区域的当前行(已经完成马赛克处理)复制给下一行 memcpy(pMaskNextLine, pMaskLine, maskStride); // 修改当前行指针,指向下一行 pMaskLine = pMaskNextLine; } } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者