#include "imagewidget.h"
#include <QDebug>
ImageWidget::ImageWidget(QWidget *parent)
: QWidget(parent)
{
m_nw=m_nh=m_niw=m_nih=0;
m_dScale_tmp=m_dScaleW=m_dScaleH=m_adjust_x=m_adjust_y=0.0;
m_myColorTable.resize(256);
for(int i = 0; i<256; i++)
m_myColorTable[i] = qRgb(i,i,i);
m_older_move_x= m_move_x=0;
m_older_move_y= m_move_y=0;
m_mousePressPoint=QPoint(0,0);
m_mouseReleasePoint=QPoint(0,0);
m_mouseMovePoint=QPoint(0,0);
m_scale=1;
setImage(QImage("test.jpg"));
m_Edisplaystyle=EDisplayStyle::FITWINDOW;
m_painter=new QPainter(this);
m_EmouseOpstatus=MOS_ADJUST_SIZE;
m_pen_size=4;
m_bMoveFlag=false;
m_penCursor=QPixmap("pen.png");
m_xpcCursor=QPixmap("xpc.png");
m_penQCursor=QCursor(m_penCursor,0,m_penCursor.height());
m_xpcQCursor=QCursor(m_xpcCursor,0,m_xpcCursor.height());
}
void ImageWidget::setDisplayStyle(EDisplayStyle _style)
{
m_Edisplaystyle=_style;
}
void ImageWidget::setMouseOpstatus(EmouseOpStatus _EmouseOpstatus)
{
m_EmouseOpstatus=_EmouseOpstatus;
}
ImageWidget::~ImageWidget()
{
}
void ImageWidget::paintEvent(QPaintEvent * event)
{
Q_UNUSED(event);
QPainter painter_tmp(this);
//第一步 画图片
drawImage(&painter_tmp);
}
void ImageWidget::setImage(QImage &image)
{
QMutexLocker lock(&m_mutex);
if (image.isNull())
{
return;
}
if (m_DisplayImage.isNull()||m_DisplayImage.size()!=image.size()||m_DisplayImage.format()!=image.format())
{
m_OriginalImage=m_DisplayImage=image;
return;
}
int bpp = image.depth()/8;
setImage(image.bits(),image.width()*image.height()*bpp,image.width(),image.height());
}
void ImageWidget::setImage(const uchar *data, int data_length, int width, int height)
{
//得到图像的位深
int Dst_bpp=m_DisplayImage.depth()/8;
int Src_bpp=data_length/(width*height);
//如果当前图像的大小和位深和要显示的图像一样则直接内存拷贝就行
if (Dst_bpp==Src_bpp&&m_DisplayImage.width()==width&&m_DisplayImage.height()==height)
{
memcpy(m_DisplayImage.bits(),data,data_length);
}
else
{
QImage::Format fmt;
//否则,就要确定图像的类型
switch (Src_bpp)
{
case 1:
fmt=QImage::Format_Indexed8;
break;
case 3:
fmt=QImage::Format_RGB888;
break;
case 4:
fmt=QImage::Format_ARGB32;
break;
default:
return;
}
//重新为图像赋值
m_DisplayImage=QImage(data,width,height,fmt);
if (fmt==QImage::Format_Indexed8)
{
m_DisplayImage.setColorTable(m_myColorTable);
}
}
this->update();
}
void ImageWidget::setCircleVtr(std::vector<QPoint> _circleVtr)
{
m_circleVtr=_circleVtr;
update();
}
void ImageWidget::mousePressEvent(QMouseEvent *event)
{
m_mousePressPoint=event->pos();
//m_mouseMovePoint=QPoint(-1,-1);
m_mouseReleasePoint=QPoint(-1,-1);
if (event->button()==Qt::RightButton)
{
switch (m_EmouseOpstatus)
{
case MOS_NONE:
break;
default:
m_EmouseOpstatus=MOS_ADJUST_SIZE;
break;
}
}
else if (event->button()==Qt::LeftButton)
{
switch (m_EmouseOpstatus)
{
case MOS_NONE:
break;
case MOS_ADJUST_SIZE:
m_bMoveFlag=true;
default:
break;
}
}
update();
}
void ImageWidget::mouseMoveEvent(QMouseEvent *event)
{
m_mouseMovePoint=event->pos();
switch (m_EmouseOpstatus)
{
case ImageWidget::MOS_NONE:
break;
case ImageWidget::MOS_ADJUST_SIZE:
if (m_bMoveFlag)
{
m_move_x=m_mouseMovePoint.x()-m_mousePressPoint.x();
m_move_y=m_mouseMovePoint.y()-m_mousePressPoint.y();
}
break;
default:
break;
}
update();
}
void ImageWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button()==Qt::LeftButton)
{
m_mouseReleasePoint=event->pos();
switch (m_EmouseOpstatus)
{
case ImageWidget::MOS_NONE:
break;
case ImageWidget::MOS_ADJUST_SIZE:
m_move_x=m_mouseReleasePoint.x()-m_mousePressPoint.x();
m_move_y=m_mouseReleasePoint.y()-m_mousePressPoint.y();
m_older_move_x+=m_move_x;
m_older_move_y+=m_move_y;
m_move_x=0;
m_move_y=0;
m_bMoveFlag=false;
break;
default:
break;
}
}
update();
}
void ImageWidget::wheelEvent(QWheelEvent * event)
{
//得到滚轮转动的数值
QPoint numDegrees = event->angleDelta() / 8;
double iw=m_DisplayImage.width();
double ih=m_DisplayImage.height();
if (numDegrees.y()>0)
{
if (m_EmouseOpstatus==MOS_ADJUST_SIZE)
{
m_scale+=0.2; //放大比例增加0.2
/*
//保证以图片中心作为缩放中心
m_older_move_x-=0.2*(iw/2);
m_older_move_y-=0.2*(ih/2);
*/
}
}
else
{
if (m_EmouseOpstatus==MOS_ADJUST_SIZE)
{
m_scale-=0.2;
if(m_scale<0.2)
{
m_scale=0.2;
}
else
{
/*
m_older_move_x+=0.2*(iw/2);
m_older_move_y+=0.2*(ih/2);
*/
}
}
}
update();
}
bool ImageWidget::validatePosInImage(QPoint pos)
{
if (m_DisplayImage.isNull())
{
return false;
}
//将点击位置转换到图像上
QPoint mapPos=m_matrix.inverted().map(pos);
//获取图片大小
double iw=m_DisplayImage.width();
double ih=m_DisplayImage.height();
QRect imgRect(0,0,iw,ih);
//判断是否在图像内
return imgRect.contains(mapPos);
}
//绘制图片
void ImageWidget::drawImage(QPainter* painter)
{
//设置画布大小
QPixmap buff(this->size());
//设置画笔
QPainter p(&buff);
p.setRenderHint(QPainter::SmoothPixmapTransform);
//记录图片的缩放比例
if (!m_DisplayImage.isNull())
{
//得到控件大小
m_nw =this->width();
m_nh=this->height();
//得到图片大小
m_niw=m_DisplayImage.width();
m_nih=m_DisplayImage.height();
if (m_Edisplaystyle==FITWINDOW)
{
//计算控件和图片的比例
m_dScaleW=(double)m_nw/(double)m_niw;
m_dScaleH=(double)m_nh/(double)m_nih;
//取小比例,保证图片完全显示在控件内
m_dScaleW=m_dScaleH=qMin(m_dScaleW,m_dScaleH);
//放大或者缩小图片
m_dScale_tmp=m_scale*m_dScaleW;
m_niw*=m_dScaleW;
m_nih*=m_dScaleW;
//调整图片在控件出现的位置
m_adjust_x=-(m_niw-m_nw)/2+m_older_move_x+m_move_x ;
m_adjust_y=-(m_nih-m_nh)/2+m_older_move_y+m_move_y ;
}
else
{
m_dScale_tmp=m_scale;
m_adjust_x=-(m_niw-m_nw)/2+m_older_move_x+m_move_x;
m_adjust_y=-(m_nih-m_nh)/2+m_older_move_y+m_move_y;
}
//计算画笔的绘制的转换矩阵
m_matrix=QMatrix().translate(m_adjust_x,m_adjust_y).scale(m_dScale_tmp,m_dScale_tmp);
p.setMatrix(m_matrix);
p.drawPixmap(0,0,QPixmap::fromImage(m_DisplayImage));
}
//绘制图片
painter->drawPixmap(0,0,buff);
}
//获得当前显示的图片
QImage ImageWidget::getDisplayImage()
{
QMutexLocker lock(&m_mutex);
return m_DisplayImage;
}
//设置画笔大小
void ImageWidget::setPenSize(int size)
{
m_pen_size=size;
}
void ImageWidget::initSize()
{
m_older_move_x= m_move_x=0;
m_older_move_y= m_move_y=0;
m_scale=1;
update();
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt下的自定义图像显示控件
共29个文件
cpp:7个
h:4个
png:4个
3星 · 超过75%的资源 需积分: 46 127 下载量 2 浏览量
2017-01-07
16:19:19
上传
评论 3
收藏 9.68MB ZIP 举报
温馨提示
支持图像的放大缩小和移动,适合图像开发者的入门借鉴,支持高帧率相机的图像采集得显示。(必须得50个字的介绍)
资源推荐
资源详情
资源评论
收起资源包目录
BuilMaskDemo.zip (29个子文件)
BuilMaskDemo
main.cpp 183B
BuilMaskDemo.vcxproj 11KB
builmaskdemo.qrc 72B
Resources
builmaskdemo.ui 728B
BuilMaskDemo.opensdf 36B
BuilMaskDemo.v11.suo 48KB
BuildMaskLinkDll
Resources
GeneratedFiles
Debug
Release
moc_imagewidget.cpp 5KB
moc_buildmasklinkdll.cpp 5KB
BuildMaskLinkDll.vcxproj.filters 3KB
BuildMaskLinkDll.ui 2KB
imagewidget.cpp 7KB
buildmasklinkdll_global.h 282B
buildmasklinkdll.h 408B
BuildMaskLinkDll.vcxproj.user 626B
imagewidget.h 2KB
buildmasklinkdll.cpp 520B
pen.png 2KB
test.jpg 142KB
xpc.png 1KB
BuildMaskLinkDll.vcxproj 11KB
GeneratedFiles
Debug
Release
moc_builmaskdemo.cpp 3KB
BuilMaskDemo.vcxproj.user 626B
builmaskdemo.h 394B
Win32
builmaskdemo.cpp 297B
BuilMaskDemo.sdf 30.94MB
BuilMaskDemo.sln 3KB
pen.png 2KB
BuilMaskDemo.vcxproj.filters 3KB
xpc.png 1KB
共 29 条
- 1
资源评论
- 发飙的小白2022-06-04打不开,没有用
- hzsjun2018-12-27学习下用用
Wu_Patrick
- 粉丝: 29
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功