From af88a6a67ec688d9f7d290baf7fdb8150bbe5e56 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Thu, 18 Sep 2025 16:14:20 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96QGraphicsView?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E9=80=BB=E8=BE=91=EF=BC=9B=202=E3=80=81hdr?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=B7=BB=E5=8A=A0byte=20order=20=3D=200?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HPPA/ImageViewer.cpp | 110 ++++++++++++++++++++--------------- HPPA/ImageViewer.h | 2 +- HPPA/ImagerOperationBase.cpp | 1 + HPPA/ResononNirImager.cpp | 1 + 4 files changed, 66 insertions(+), 48 deletions(-) diff --git a/HPPA/ImageViewer.cpp b/HPPA/ImageViewer.cpp index 3c071a6..042acca 100644 --- a/HPPA/ImageViewer.cpp +++ b/HPPA/ImageViewer.cpp @@ -14,8 +14,17 @@ ImageViewer::ImageViewer(QWidget* pParent) :QGraphicsView(pParent) { + setRenderHint(QPainter::Antialiasing); + setRenderHint(QPainter::SmoothPixmapTransform); + setDragMode(QGraphicsView::ScrollHandDrag); + + // 关键点:不使用 Qt 默认的 anchor,而是自己控制 + setTransformationAnchor(QGraphicsView::NoAnchor); + setResizeAnchor(QGraphicsView::NoAnchor); + m_qtGraphicsScene = new QGraphicsScene(this); this->setScene(m_qtGraphicsScene); + m_qtGraphicsScene->setSceneRect(-1e6, -1e6, 2e6, 2e6); m_framNumberLabel = new QLabel(this); m_framNumberLabel->setAlignment(Qt::AlignHCenter); @@ -61,9 +70,24 @@ void ImageViewer::SetImage(QPixmap *image) { m_GraphicsPixmapItemHandle->setPixmap(*image); } + ensureSceneVisible(); +} - setSceneRect(QRectF(image->rect())); - +void ImageViewer::ensureSceneVisible() +{ + resetTransform(); + + auto view_rect = viewport()->rect(); + auto scene_rect = this->scene()->itemsBoundingRect(); + + double x_ratio = view_rect.width() / scene_rect.width(); + double y_ratio = view_rect.height() / scene_rect.height(); + double scale_factor = std::min(x_ratio, y_ratio) * 0.9; + + scale(scale_factor, scale_factor); + m_scale *= scale_factor; + + centerOn(scene_rect.center()); } bool ImageViewer::HasImage() @@ -81,37 +105,50 @@ bool ImageViewer::HasImage() void ImageViewer::wheelEvent(QWheelEvent *event) { //qDebug() << "---------------+++++++++++++++++++++++++++++++++++++++++++++++++++ "; - if (true)//HasImage() + //if (true)//HasImage() + //{ + // //围绕鼠标点放大:https://blog.csdn.net/GoForwardToStep/article/details/77035287?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param + // // 获取当前鼠标相对于view的位置; + // QPointF cursorPoint = event->pos(); + // // 获取当前鼠标相对于scene的位置; + // QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); + + // // 获取view的宽高; + // qreal viewWidth = this->viewport()->width(); + // qreal viewHeight = this->viewport()->height(); + + // // 获取当前鼠标位置相当于view大小的横纵比例; + // qreal hScale = cursorPoint.x() / viewWidth; + // qreal vScale = cursorPoint.y() / viewHeight; + + + // // 滚轮的滚动量 + // QPoint scrollAmount = event->angleDelta(); + // // 正值表示滚轮远离使用者放大负值表示朝向使用者缩小 + // scrollAmount.y() > 0 ? zoomIn() : zoomOut(); + + + // // 将scene坐标转换为放大缩小后的坐标; + // QPointF viewPoint = this->matrix().map(scenePos); + // // 通过滚动条控制view放大缩小后的展示scene的位置; + // horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); + // verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); + //} + + if (HasImage()) { - //围绕鼠标点放大:https://blog.csdn.net/GoForwardToStep/article/details/77035287?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param - // 获取当前鼠标相对于view的位置; - QPointF cursorPoint = event->pos(); - // 获取当前鼠标相对于scene的位置; - QPointF scenePos = this->mapToScene(QPoint(cursorPoint.x(), cursorPoint.y())); + QPointF oldPos = mapToScene(event->pos()); - // 获取view的宽高; - qreal viewWidth = this->viewport()->width(); - qreal viewHeight = this->viewport()->height(); - - // 获取当前鼠标位置相当于view大小的横纵比例; - qreal hScale = cursorPoint.x() / viewWidth; - qreal vScale = cursorPoint.y() / viewHeight; - - - // 滚轮的滚动量 QPoint scrollAmount = event->angleDelta(); - // 正值表示滚轮远离使用者放大负值表示朝向使用者缩小 scrollAmount.y() > 0 ? zoomIn() : zoomOut(); + QPointF newPos = mapToScene(event->pos()); - // 将scene坐标转换为放大缩小后的坐标; - QPointF viewPoint = this->matrix().map(scenePos); - // 通过滚动条控制view放大缩小后的展示scene的位置; - horizontalScrollBar()->setValue(int(viewPoint.x() - viewWidth * hScale)); - verticalScrollBar()->setValue(int(viewPoint.y() - viewHeight * vScale)); + QPointF delta = newPos - oldPos; + translate(delta.x(), delta.y()); } - QGraphicsView::wheelEvent(event); + //QGraphicsView::wheelEvent(event);//???????????????? } void ImageViewer::scaling(qreal scaleFactor) @@ -141,7 +178,7 @@ void ImageViewer::mouseMoveEvent(QMouseEvent *event) { if (m_bMouseTranslate){ QPointF mouseDelta = mapToScene(event->pos()) - mapToScene(m_lastMousePos); - translate(mouseDelta); + translate(mouseDelta.x(),mouseDelta.y()); } m_lastMousePos = event->pos(); @@ -180,27 +217,6 @@ void ImageViewer::zoom(float scaleFactor) m_scale *= scaleFactor; } -void ImageViewer::translate(QPointF delta) -{ - // 根据当前 zoom 缩放平移数 - delta *= m_scale; - delta *= m_translateSpeed; - - ////方法1: - //scene()->setSceneRect(scene()->sceneRect().x() - delta.x(), scene()->sceneRect().y() - delta.y(), - // scene()->sceneRect().width(), scene()->sceneRect().height()); - //scene()->update(); - - //方法2: - // view 根据鼠标下的点作为锚点来定位 scene - setTransformationAnchor(QGraphicsView::AnchorUnderMouse); - QPoint newCenter(VIEW_WIDTH / 2 - delta.x(), VIEW_HEIGHT / 2 - delta.y()); - centerOn(mapToScene(newCenter)); - - // scene 在 view 的中心点作为锚点 - setTransformationAnchor(QGraphicsView::AnchorViewCenter); -} - void ImageViewer::setTranslateSpeed(qreal speed) { // 建议速度范围 diff --git a/HPPA/ImageViewer.h b/HPPA/ImageViewer.h index 792817d..86f4dd0 100644 --- a/HPPA/ImageViewer.h +++ b/HPPA/ImageViewer.h @@ -22,6 +22,7 @@ public: void SetImage(QPixmap *image); bool HasImage(); + void ensureSceneVisible(); void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE; void scaling(qreal scaleFactor); @@ -29,7 +30,6 @@ public: void zoomIn(); // 放大 void zoomOut(); // 缩小 void zoom(float scaleFactor); // 缩放 - scaleFactor缩放的比例因子 - void translate(QPointF delta); // 平移 // 平移速度 void setTranslateSpeed(qreal speed); diff --git a/HPPA/ImagerOperationBase.cpp b/HPPA/ImagerOperationBase.cpp index 2fd33f4..f179220 100644 --- a/HPPA/ImagerOperationBase.cpp +++ b/HPPA/ImagerOperationBase.cpp @@ -497,6 +497,7 @@ void ImagerOperationBase::WriteHdr() outfile << "interleave = bil\n"; outfile << "data type = 12\n"; outfile << "bit depth = 12\n"; + outfile << "byte order = 0\n"; outfile << "samples = " << getSampleCount() << "\n"; outfile << "bands = " << getBandCount() << "\n"; outfile << "lines = " << m_iFrameCounter << "\n"; diff --git a/HPPA/ResononNirImager.cpp b/HPPA/ResononNirImager.cpp index 6d1f92c..3ec5c14 100644 --- a/HPPA/ResononNirImager.cpp +++ b/HPPA/ResononNirImager.cpp @@ -399,6 +399,7 @@ void ResononNirImager::WriteHdr() outfile << "interleave = bil\n"; outfile << "data type = 12\n"; outfile << "bit depth = 12\n"; + outfile << "byte order = 0\n"; outfile << "samples = " << getSampleCount() << "\n"; outfile << "bands = " << getBandCount() << "\n"; outfile << "lines = " << m_iFrameCounter << "\n";