#pragma once #include #include #include #include #include #include #include "preHeader.h" #include "MfcLabel.h" using namespace MfcLabel; typedef void(*ShowPictureInQPixMapCallBack)(QPixmap* pBoard, double dbScale, QPoint ptOffset, void* Param); /** * 功能:用于在Qt里面在qlabel内完成图像显示的类,实现了鼠标拖动和滚轮缩放 * 作者:kangjq * 日期:2023年3月14日 **/ enum ShowMode { Fit = 1, OneToOne, Free, YUV_Fit, YUV_OneToOne, YUV_Free }; class QtPainterModule { public: QtPainterModule(); ~QtPainterModule(); //设置绘制地块 void SetLabelRect(QRect pQRect); //设置画板 void SetPixmap(QPixmap* pDrawBoard); //设置原始图像 void SetOrginImage(QImage* pImage); //设置原始图像yuv版本 void SetOrginImage(QByteArray* pYuvImage,int nWidth,int nHeight); //设置画家(让谁来搞 void SetPainter(QPainter* pPainter); //设置是否使用yuv显示 void SetYUVShowOrNot(bool bYUVShowOrNot); //设置初始的scale和显示坐标 void init(); //鼠标拖动 void CalculateMouseDragOffset(QPoint ptOldMouse, QPoint ptNewMouse); //鼠标拖动另一种参数传输方式 void CalculateMouseDragOffset(int Offset_x, int Offset_y); //滚轮微调 void CalculateWheelZoomOffsetAndScale(QPoint ptMouse, bool bEnlargeOrNarrow, double dbScale); //显示窗口计算 bool CalculateShowRectInDC(QPoint ptOffset, double dbScale); //将图像中数据以指定的scale倍率复制到pixmap上面,由指定区域的绘制出来 void PasteImageInDC(); //一个特殊的函数用于将yuv图像修改至可以显示的区域 void PasteYUVImageInDC(); //绘制函数 void Draw(ShowMode Flags, void* pCallBack = NULL , void* pParam = NULL); public: QRect OutputPaintRect;//最终的输出的区域 float* OutputOffsetX;//用于与他人同步的偏移系数X float* OutputOffsetY;//用于与他人同步的偏移系数Y QPixmap* DrawBoard;//用于绘制的图像画板 QImage* OrginImg;//原始图像 QPainter* DrawPainter;//绘制画家本家 QByteArray* pYUVData;//用于存放yuv图像的数据 //原始yuv图像的大小 int nYUVImageWidth; int nYUVImageHeight; //回调函数使用的参数 void* pCallBackParam; //用于存放临时的裁剪过后的Image的指针 std::shared_ptr pClipImage; //用于显示yuv特地准备的指针 std::shared_ptr pYUVImage; //显示的yuv的图像大小 int nYUVShowImageWidth; int nYUVShowImageHeight; double Scale;//放缩系数 bool EditScaleOrNot;//之前的放缩系数 COLORREF m_BackGroundColor;//背景色 fRect ImgRect;//图像大小,图像原本大小 fRect ClientRect;//显示区域大小,坐标不变固定的方框 fRect CurImageRect;//当前图像区域,随着缩放变化,平移变化 fRect ShowImageRect;//显示区域中图片的区域 fRect ShowClientRect;//显示区域中客户区域 fPoint Offset;//偏移系数 bool bYUVShowOrNot;//是否使用yuv显示 bool FitUseWidthOrHeight;//是否使用宽度或者高度来进行fit private: //使用fit模式来显示 void ShowInFitMode(void* pCallBack = NULL); //使用1:1模式显示 void ShowInOneToOneMode(void* pCallBack = NULL); //使用自由模式显示 void ShowInFreeMode(void* pCallBack = NULL); //使用libyuv来进行图像的裁剪 bool ClipYUVImageByLibYUV(unsigned char* pSrcImage, QRect ClipRect, unsigned char* pDstImage, QRect ClipDstRc); //使用libyuv来进行图像的缩放 bool ScaleYUVImageByLibYUV(unsigned char* pSrcImage, QRect ClipRect, unsigned char* pDstImage, QRect ClipDstRc); };