QtPainterModule.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #pragma once
  2. #include <qevent.h>
  3. #include <QtCore>
  4. #include <QtWidgets>
  5. #include <QDialog>
  6. #include <qpainter.h>
  7. #include <qvector.h>
  8. #include "preHeader.h"
  9. #include "MfcLabel.h"
  10. using namespace MfcLabel;
  11. typedef void(*ShowPictureInQPixMapCallBack)(QPixmap* pBoard, double dbScale, QPoint ptOffset, void* Param);
  12. /**
  13. * 功能:用于在Qt里面在qlabel内完成图像显示的类,实现了鼠标拖动和滚轮缩放
  14. * 作者:kangjq
  15. * 日期:2023年3月14日
  16. **/
  17. enum ShowMode
  18. {
  19. Fit = 1,
  20. OneToOne,
  21. Free,
  22. YUV_Fit,
  23. YUV_OneToOne,
  24. YUV_Free
  25. };
  26. class QtPainterModule
  27. {
  28. public:
  29. QtPainterModule();
  30. ~QtPainterModule();
  31. //设置绘制地块
  32. void SetLabelRect(QRect pQRect);
  33. //设置画板
  34. void SetPixmap(QPixmap* pDrawBoard);
  35. //设置原始图像
  36. void SetOrginImage(QImage* pImage);
  37. //设置原始图像yuv版本
  38. void SetOrginImage(QByteArray* pYuvImage,int nWidth,int nHeight);
  39. //设置画家(让谁来搞
  40. void SetPainter(QPainter* pPainter);
  41. //设置是否使用yuv显示
  42. void SetYUVShowOrNot(bool bYUVShowOrNot);
  43. //设置初始的scale和显示坐标
  44. void init();
  45. //鼠标拖动
  46. void CalculateMouseDragOffset(QPoint ptOldMouse, QPoint ptNewMouse);
  47. //鼠标拖动另一种参数传输方式
  48. void CalculateMouseDragOffset(int Offset_x, int Offset_y);
  49. //滚轮微调
  50. void CalculateWheelZoomOffsetAndScale(QPoint ptMouse, bool bEnlargeOrNarrow, double dbScale);
  51. //显示窗口计算
  52. bool CalculateShowRectInDC(QPoint ptOffset, double dbScale);
  53. //将图像中数据以指定的scale倍率复制到pixmap上面,由指定区域的绘制出来
  54. void PasteImageInDC();
  55. //一个特殊的函数用于将yuv图像修改至可以显示的区域
  56. void PasteYUVImageInDC();
  57. //绘制函数
  58. void Draw(ShowMode Flags, void* pCallBack = NULL , void* pParam = NULL);
  59. public:
  60. QRect OutputPaintRect;//最终的输出的区域
  61. float* OutputOffsetX;//用于与他人同步的偏移系数X
  62. float* OutputOffsetY;//用于与他人同步的偏移系数Y
  63. QPixmap* DrawBoard;//用于绘制的图像画板
  64. QImage* OrginImg;//原始图像
  65. QPainter* DrawPainter;//绘制画家本家
  66. QByteArray* pYUVData;//用于存放yuv图像的数据
  67. //原始yuv图像的大小
  68. int nYUVImageWidth;
  69. int nYUVImageHeight;
  70. //回调函数使用的参数
  71. void* pCallBackParam;
  72. //用于存放临时的裁剪过后的Image的指针
  73. std::shared_ptr<unsigned char> pClipImage;
  74. //用于显示yuv特地准备的指针
  75. std::shared_ptr<unsigned char> pYUVImage;
  76. //显示的yuv的图像大小
  77. int nYUVShowImageWidth;
  78. int nYUVShowImageHeight;
  79. double Scale;//放缩系数
  80. bool EditScaleOrNot;//之前的放缩系数
  81. COLORREF m_BackGroundColor;//背景色
  82. fRect ImgRect;//图像大小,图像原本大小
  83. fRect ClientRect;//显示区域大小,坐标不变固定的方框
  84. fRect CurImageRect;//当前图像区域,随着缩放变化,平移变化
  85. fRect ShowImageRect;//显示区域中图片的区域
  86. fRect ShowClientRect;//显示区域中客户区域
  87. fPoint Offset;//偏移系数
  88. bool bYUVShowOrNot;//是否使用yuv显示
  89. bool FitUseWidthOrHeight;//是否使用宽度或者高度来进行fit
  90. private:
  91. //使用fit模式来显示
  92. void ShowInFitMode(void* pCallBack = NULL);
  93. //使用1:1模式显示
  94. void ShowInOneToOneMode(void* pCallBack = NULL);
  95. //使用自由模式显示
  96. void ShowInFreeMode(void* pCallBack = NULL);
  97. //使用libyuv来进行图像的裁剪
  98. bool ClipYUVImageByLibYUV(unsigned char* pSrcImage, QRect ClipRect, unsigned char* pDstImage, QRect ClipDstRc);
  99. //使用libyuv来进行图像的缩放
  100. bool ScaleYUVImageByLibYUV(unsigned char* pSrcImage, QRect ClipRect, unsigned char* pDstImage, QRect ClipDstRc);
  101. };