背景描述
在视频监控软件中,我们看到很多的软件都有电子放大功能, 按住鼠标左键不放,框选一个区域,再松开鼠标左键,即对选中的区域进行放大显示, 且可以重复该操作,逐步放大所需显示的区域, 有没有觉得,这个功能在视频监控软件中还是有他的用武地. 今天我们就来实现该功能;
实现流程
//设置电子放大起起始点int SetElectronicZoomStartPoint(int channelId, float fXPercent, float fYPercent, unsigned char showBox);//设置电子放大结束点(在鼠标移动过程中可一直调用该函数)int SetElectronicZoomEndPoint(int channelId, float fXPercent, float fYPercent);//设置是否放大显示int SetElectronicZoom(int channelId, int zoomIn);//复位void ResetElectronicZoom(int channelId);//直接设置显示区域,用于电子放大, 在某些场合, 需要直接进行缩放显示, 即可调用该函数实现int SetRenderRect(int channelId, LPRECT lpSrcRect);
代码实现
int ChannelManager::ElectronicZoomProcess(MEDIA_VIDEO_CHANNEL_OBJ_T *pMediaChannel, EASY_FRAME_INFO *frameInfo){if (NULL == pMediaChannel) return 0;if (NULL == frameInfo) return 0;ELECTRONIC_ZOOM_T *pElectoricZoom = pMediaChannel->pElectoricZoom;if (NULL == pElectoricZoom) return 0;int nLeft = 0, nTop = 0, nRight = 0, nBottom = 0;if (pElectoricZoom->zoomIn >= 0x01){ RECT rcClient; GetClientRect(pMediaChannel->mediaDisplay.hWnd, &rcClient); float fLeftPercent = pElectoricZoom->fStartPointX; float fTopPercent = pElectoricZoom->fStartPointY; float fRightPercent = pElectoricZoom->fEndPointX; float fBottomPercent = pElectoricZoom->fEndPointY; if (fRightPercent > fLeftPercent && fBottomPercent > fTopPercent) //逐步放大 { if (pElectoricZoom->fVideoWidth > 0) { int video_width = (int)pElectoricZoom->fVideoWidth; int video_height= (int)pElectoricZoom->fVideoHeight; nLeft = (int)((float)video_width / 100.0f * fLeftPercent); nTop = (int)((float)video_height/ 100.0f * fTopPercent); nRight = (int)((float)video_width / 100.0f * fRightPercent); nBottom = (int)((float)video_height/ 100.0f * fBottomPercent); if (nRight > nLeft && nBottom > nTop) { pElectoricZoom->fVideoWidth = (float)(nRight - nLeft); pElectoricZoom->fVideoHeight = (float)(nBottom - nTop); nLeft = pElectoricZoom->startVideoLeft + nLeft; nTop = pElectoricZoom->startVideoTop + nTop; nRight = pElectoricZoom->startVideoLeft + nRight; nBottom = pElectoricZoom->startVideoTop + nBottom; pElectoricZoom->startVideoLeft = nLeft; pElectoricZoom->startVideoTop = nTop; if (pElectoricZoom->zoomIndex + 1zoomParam[pElectoricZoom->zoomIndex].rect, nLeft, nTop, nRight, nBottom); pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].fVideoWidth = pElectoricZoom->fVideoWidth; pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].fVideoHeight = pElectoricZoom->fVideoHeight; pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].startVideoLeft = pElectoricZoom->startVideoLeft; pElectoricZoom->zoomParam[pElectoricZoom->zoomIndex].startVideoTop = pElectoricZoom->startVideoTop; pElectoricZoom->zoomIndex ++; } } else { int idx = pElectoricZoom->zoomIndex-2; if (idx > 0) { nLeft = pElectoricZoom->zoomParam[idx].rect.left; nTop = pElectoricZoom->zoomParam[idx].rect.top; nRight = pElectoricZoom->zoomParam[idx].rect.right; nBottom = pElectoricZoom->zoomParam[idx].rect.bottom; pElectoricZoom->fVideoWidth = pElectoricZoom->zoomParam[idx].fVideoWidth; pElectoricZoom->fVideoHeight = pElectoricZoom->zoomParam[idx].fVideoHeight; pElectoricZoom->startVideoLeft = pElectoricZoom->zoomParam[idx].startVideoLeft; pElectoricZoom->startVideoTop = pElectoricZoom->zoomParam[idx].startVideoTop; } } } else { int video_width = frameInfo->width; int video_height= frameInfo->height; nLeft = (int)((float)video_width / 100.0f * fLeftPercent); nTop = (int)((float)video_height/ 100.0f * fTopPercent); nRight = (int)((float)video_width / 100.0f * fRightPercent); nBottom = (int)((float)video_height/ 100.0f * fBottomPercent); pElectoricZoom->startVideoLeft = nLeft; pElectoricZoom->startVideoTop = nTop; pElectoricZoom->fVideoWidth = (float)(nRight - nLeft); pElectoricZoom->fVideoHeight = (float)(nBottom - nTop); SetRect(&pElectoricZoom->zoomParam[0].rect, nLeft, nTop, nRight, nBottom); pElectoricZoom->zoomParam[0].fVideoWidth = pElectoricZoom->fVideoWidth; pElectoricZoom->zoomParam[0].fVideoHeight = pElectoricZoom->fVideoHeight; pElectoricZoom->zoomParam[0].startVideoLeft = pElectoricZoom->startVideoLeft; pElectoricZoom->zoomParam[0].startVideoTop = pElectoricZoom->startVideoTop; pElectoricZoom->zoomIndex ++; } } else { if (pElectoricZoom->zoomIndex > 1) { int idx = pElectoricZoom->zoomIndex-2; nLeft = pElectoricZoom->zoomParam[idx].rect.left; nTop = pElectoricZoom->zoomParam[idx].rect.top; nRight = pElectoricZoom->zoomParam[idx].rect.right; nBottom = pElectoricZoom->zoomParam[idx].rect.bottom; pElectoricZoom->fVideoWidth = pElectoricZoom->zoomParam[idx].fVideoWidth; pElectoricZoom->fVideoHeight = pElectoricZoom->zoomParam[idx].fVideoHeight; pElectoricZoom->startVideoLeft = pElectoricZoom->zoomParam[idx].startVideoLeft; pElectoricZoom->startVideoTop = pElectoricZoom->zoomParam[idx].startVideoTop; pElectoricZoom->zoomIndex --; } else { pElectoricZoom->fVideoWidth = 0.0f; nLeft = 0; nTop = 0; nRight = frameInfo->width; nBottom = frameInfo->height; pElectoricZoom->zoomIndex = 0; } } RECT rcSrc; SetRect(&rcSrc, nLeft, nTop, nRight, nBottom); CopyRect(&pMediaChannel->mediaDisplay.rcSrcRender, &rcSrc); pElectoricZoom->zoomIn --;}return 0;}
关于EasyPlayerPro
EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP、RTMP、HTTP、HLS、UDP、RTP、File等多种流媒体协议播放、支持本地文件播放,支持本地抓拍、本地录像、播放旋转、多屏播放、倍数播放等多种功能特性,核心基于ffmpeg,稳定、高效、可靠、可控,支持Windows、Android、iOS三个平台,目前在多家教育、安防、行业型公司,都得到的应用,广受好评!
EasyPlayerPro:
点击链接加入群【EasyPlayer & EasyPlayerPro】:
技术支持
邮件:
Tel:13718530929
QQ交流群:
EasyPlayerPro是一款非常稳定的全协议/全功能播放器组件,各平台版本需要经过授权才能商业使用,商业授权方案可以通过以上渠道进行更深入的技术与合作咨询;
获取更多信息
EasyDarwin开源流媒体服务器:
EasyDSS商用流媒体解决方案:
EasyNVR无插件直播方案:
Copyright © EasyDarwin Team 2012-2017