Commit 1d9660c6 authored by Roman Donchenko's avatar Roman Donchenko Committed by OpenCV Buildbot

Merge pull request #954 from LeszekSwirski:24_fix-qtwindow

parents 1aa7b159 7d0f6b4d
...@@ -2473,35 +2473,33 @@ void DefaultViewPort::saveView() ...@@ -2473,35 +2473,33 @@ void DefaultViewPort::saveView()
if (!fileName.isEmpty()) //save the picture if (!fileName.isEmpty()) //save the picture
{ {
QString extension = fileName.right(3); QString extension = fileName.right(3);
// (no need anymore) create the image resized to receive the 'screenshot' // Create a new pixmap to render the viewport into
// image2Draw_qt_resized = QImage(viewport()->width(), viewport()->height(),QImage::Format_RGB888); QPixmap viewportPixmap(viewport()->size());
viewport()->render(&viewportPixmap);
QPainter saveimage(&image2Draw_qt_resized);
this->render(&saveimage);
// Save it.. // Save it..
if (QString::compare(extension, "png", Qt::CaseInsensitive) == 0) if (QString::compare(extension, "png", Qt::CaseInsensitive) == 0)
{ {
image2Draw_qt_resized.save(fileName, "PNG"); viewportPixmap.save(fileName, "PNG");
return; return;
} }
if (QString::compare(extension, "jpg", Qt::CaseInsensitive) == 0) if (QString::compare(extension, "jpg", Qt::CaseInsensitive) == 0)
{ {
image2Draw_qt_resized.save(fileName, "JPG"); viewportPixmap.save(fileName, "JPG");
return; return;
} }
if (QString::compare(extension, "bmp", Qt::CaseInsensitive) == 0) if (QString::compare(extension, "bmp", Qt::CaseInsensitive) == 0)
{ {
image2Draw_qt_resized.save(fileName, "BMP"); viewportPixmap.save(fileName, "BMP");
return; return;
} }
if (QString::compare(extension, "jpeg", Qt::CaseInsensitive) == 0) if (QString::compare(extension, "jpeg", Qt::CaseInsensitive) == 0)
{ {
image2Draw_qt_resized.save(fileName, "JPEG"); viewportPixmap.save(fileName, "JPEG");
return; return;
} }
...@@ -2651,17 +2649,16 @@ void DefaultViewPort::paintEvent(QPaintEvent* evnt) ...@@ -2651,17 +2649,16 @@ void DefaultViewPort::paintEvent(QPaintEvent* evnt)
//Now disable matrixWorld for overlay display //Now disable matrixWorld for overlay display
myPainter.setWorldMatrixEnabled(false); myPainter.setWorldMatrixEnabled(false);
//overlay pixel values if zoomed in far enough
if (param_matrixWorld.m11()*ratioX >= threshold_zoom_img_region &&
param_matrixWorld.m11()*ratioY >= threshold_zoom_img_region)
{
drawImgRegion(&myPainter);
}
//in mode zoom/panning //in mode zoom/panning
if (param_matrixWorld.m11() > 1) if (param_matrixWorld.m11() > 1)
{ {
if (param_matrixWorld.m11() >= threshold_zoom_img_region)
{
if (centralWidget->param_flags == CV_WINDOW_NORMAL)
startDisplayInfo("WARNING: The values displayed are the resized image's values. If you want the original image's values, use CV_WINDOW_AUTOSIZE", 1000);
drawImgRegion(&myPainter);
}
drawViewOverview(&myPainter); drawViewOverview(&myPainter);
} }
...@@ -2887,22 +2884,24 @@ void DefaultViewPort::drawStatusBar() ...@@ -2887,22 +2884,24 @@ void DefaultViewPort::drawStatusBar()
//accept only CV_8UC1 and CV_8UC8 image for now //accept only CV_8UC1 and CV_8UC8 image for now
void DefaultViewPort::drawImgRegion(QPainter *painter) void DefaultViewPort::drawImgRegion(QPainter *painter)
{ {
if (nbChannelOriginImage!=CV_8UC1 && nbChannelOriginImage!=CV_8UC3) if (nbChannelOriginImage!=CV_8UC1 && nbChannelOriginImage!=CV_8UC3)
return; return;
qreal offsetX = param_matrixWorld.dx()/param_matrixWorld.m11(); double pixel_width = param_matrixWorld.m11()*ratioX;
double pixel_height = param_matrixWorld.m11()*ratioY;
qreal offsetX = param_matrixWorld.dx()/pixel_width;
offsetX = offsetX - floor(offsetX); offsetX = offsetX - floor(offsetX);
qreal offsetY = param_matrixWorld.dy()/param_matrixWorld.m11(); qreal offsetY = param_matrixWorld.dy()/pixel_height;
offsetY = offsetY - floor(offsetY); offsetY = offsetY - floor(offsetY);
QSize view = size(); QSize view = size();
QVarLengthArray<QLineF, 30> linesX; QVarLengthArray<QLineF, 30> linesX;
for (qreal _x = offsetX*param_matrixWorld.m11(); _x < view.width(); _x += param_matrixWorld.m11() ) for (qreal _x = offsetX*pixel_width; _x < view.width(); _x += pixel_width )
linesX.append(QLineF(_x, 0, _x, view.height())); linesX.append(QLineF(_x, 0, _x, view.height()));
QVarLengthArray<QLineF, 30> linesY; QVarLengthArray<QLineF, 30> linesY;
for (qreal _y = offsetY*param_matrixWorld.m11(); _y < view.height(); _y += param_matrixWorld.m11() ) for (qreal _y = offsetY*pixel_height; _y < view.height(); _y += pixel_height )
linesY.append(QLineF(0, _y, view.width(), _y)); linesY.append(QLineF(0, _y, view.width(), _y));
...@@ -2910,27 +2909,25 @@ void DefaultViewPort::drawImgRegion(QPainter *painter) ...@@ -2910,27 +2909,25 @@ void DefaultViewPort::drawImgRegion(QPainter *painter)
int original_font_size = f.pointSize(); int original_font_size = f.pointSize();
//change font size //change font size
//f.setPointSize(4+(param_matrixWorld.m11()-threshold_zoom_img_region)/5); //f.setPointSize(4+(param_matrixWorld.m11()-threshold_zoom_img_region)/5);
f.setPixelSize(10+(param_matrixWorld.m11()-threshold_zoom_img_region)/5); f.setPixelSize(10+(pixel_height-threshold_zoom_img_region)/5);
painter->setFont(f); painter->setFont(f);
QString val;
QRgb rgbValue;
QPointF point1;//sorry, I do not know how to name it
QPointF point2;//idem
for (int j=-1;j<height()/param_matrixWorld.m11();j++)//-1 because display the pixels top rows left colums for (int j=-1;j<height()/pixel_height;j++)//-1 because display the pixels top rows left columns
for (int i=-1;i<width()/param_matrixWorld.m11();i++)//-1 for (int i=-1;i<width()/pixel_width;i++)//-1
{ {
point1.setX((i+offsetX)*param_matrixWorld.m11()); // Calculate top left of the pixel's position in the viewport (screen space)
point1.setY((j+offsetY)*param_matrixWorld.m11()); QPointF pos_in_view((i+offsetX)*pixel_width, (j+offsetY)*pixel_height);
matrixWorld_inv.map(point1.x(),point1.y(),&point2.rx(),&point2.ry()); // Calculate top left of the pixel's position in the image (image space)
QPointF pos_in_image = matrixWorld_inv.map(pos_in_view);// Top left of pixel in view
point2.rx()= (long) (point2.x() + 0.5); pos_in_image.rx() = pos_in_image.x()/ratioX;
point2.ry()= (long) (point2.y() + 0.5); pos_in_image.ry() = pos_in_image.y()/ratioY;
QPoint point_in_image(pos_in_image.x() + 0.5f,pos_in_image.y() + 0.5f);// Add 0.5 for rounding
if (point2.x() >= 0 && point2.y() >= 0)
rgbValue = image2Draw_qt_resized.pixel(QPoint(point2.x(),point2.y())); QRgb rgbValue;
if (image2Draw_qt.valid(point_in_image))
rgbValue = image2Draw_qt.pixel(point_in_image);
else else
rgbValue = qRgb(0,0,0); rgbValue = qRgb(0,0,0);
...@@ -2943,29 +2940,29 @@ void DefaultViewPort::drawImgRegion(QPainter *painter) ...@@ -2943,29 +2940,29 @@ void DefaultViewPort::drawImgRegion(QPainter *painter)
painter->drawText(QRect(point1.x(),point1.y(),param_matrixWorld.m11(),param_matrixWorld.m11()/2), painter->drawText(QRect(point1.x(),point1.y(),param_matrixWorld.m11(),param_matrixWorld.m11()/2),
Qt::AlignCenter, val); Qt::AlignCenter, val);
*/ */
QString val;
val = tr("%1").arg(qRed(rgbValue)); val = tr("%1").arg(qRed(rgbValue));
painter->setPen(QPen(Qt::red, 1)); painter->setPen(QPen(Qt::red, 1));
painter->drawText(QRect(point1.x(),point1.y(),param_matrixWorld.m11(),param_matrixWorld.m11()/3), painter->drawText(QRect(pos_in_view.x(),pos_in_view.y(),pixel_width,pixel_height/3),
Qt::AlignCenter, val); Qt::AlignCenter, val);
val = tr("%1").arg(qGreen(rgbValue)); val = tr("%1").arg(qGreen(rgbValue));
painter->setPen(QPen(Qt::green, 1)); painter->setPen(QPen(Qt::green, 1));
painter->drawText(QRect(point1.x(),point1.y()+param_matrixWorld.m11()/3,param_matrixWorld.m11(),param_matrixWorld.m11()/3), painter->drawText(QRect(pos_in_view.x(),pos_in_view.y()+pixel_height/3,pixel_width,pixel_height/3),
Qt::AlignCenter, val); Qt::AlignCenter, val);
val = tr("%1").arg(qBlue(rgbValue)); val = tr("%1").arg(qBlue(rgbValue));
painter->setPen(QPen(Qt::blue, 1)); painter->setPen(QPen(Qt::blue, 1));
painter->drawText(QRect(point1.x(),point1.y()+2*param_matrixWorld.m11()/3,param_matrixWorld.m11(),param_matrixWorld.m11()/3), painter->drawText(QRect(pos_in_view.x(),pos_in_view.y()+2*pixel_height/3,pixel_width,pixel_height/3),
Qt::AlignCenter, val); Qt::AlignCenter, val);
} }
if (nbChannelOriginImage==CV_8UC1) if (nbChannelOriginImage==CV_8UC1)
{ {
QString val = tr("%1").arg(qRed(rgbValue));
val = tr("%1").arg(qRed(rgbValue)); painter->drawText(QRect(pos_in_view.x(),pos_in_view.y(),pixel_width,pixel_height),
painter->drawText(QRect(point1.x(),point1.y(),param_matrixWorld.m11(),param_matrixWorld.m11()),
Qt::AlignCenter, val); Qt::AlignCenter, val);
} }
} }
......
...@@ -522,7 +522,6 @@ private: ...@@ -522,7 +522,6 @@ private:
CvMat* image2Draw_mat; CvMat* image2Draw_mat;
QImage image2Draw_qt; QImage image2Draw_qt;
QImage image2Draw_qt_resized;
int nbChannelOriginImage; int nbChannelOriginImage;
//for mouse callback //for mouse callback
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment