Save image into file

This commit is contained in:
2020-05-17 17:59:39 +02:00
parent b71d0c4a7f
commit 72935e9288
7 changed files with 54 additions and 16 deletions
+34 -11
View File
@@ -4,6 +4,7 @@
#include <QKeyEvent>
#include <QOpenGLDebugLogger>
#include <QOpenGLPixelTransferOptions>
#include <QOpenGLFramebufferObject>
#include <QGridLayout>
void setScrollRange(QScrollBar *scrollBar, int newRange)
@@ -17,14 +18,6 @@ void setScrollRange(QScrollBar *scrollBar, int newRange)
scrollBar->setValue(relPos*newRange - page/2);
}
void setRelativePos(QScrollBar *scrollBar, float relPos)
{
int page = scrollBar->pageStep();
int pos = scrollBar->value()+page/2;
int range = scrollBar->maximum()+page;
scrollBar->setValue(pos);
}
ImageWidget::ImageWidget(QWidget *parent) : QOpenGLWidget(parent)
{
setFocusPolicy(Qt::ClickFocus);
@@ -34,6 +27,8 @@ ImageWidget::ImageWidget(QWidget *parent) : QOpenGLWidget(parent)
m_dx = m_dy = 0;
m_scale = 1.0f;
m_blockRepaint = false;
m_range = UINT16_MAX;
m_imgWidth = m_imgHeight = -1;
}
ImageWidget::~ImageWidget()
@@ -45,6 +40,9 @@ void ImageWidget::setImage(RawImage *image)
{
if(image == nullptr)return;
m_imgWidth = image->width();
m_imgHeight = image->height();
m_image->destroy();
m_image->setFormat(QOpenGLTexture::R16_UNorm);
m_image->setSize(image->width(), image->height());
@@ -56,13 +54,14 @@ void ImageWidget::setImage(RawImage *image)
{
case RawImage::UINT8:
m_image->setData(0, QOpenGLTexture::Red, QOpenGLTexture::UInt8, image->data(), m_transferOptions.get());
m_range = UINT8_MAX;
break;
case RawImage::UINT16:
m_image->setData(0, QOpenGLTexture::Red, QOpenGLTexture::UInt16, image->data(), m_transferOptions.get());
m_range = UINT16_MAX;
break;
case RawImage::FLOAT32:
m_image->setData(0, QOpenGLTexture::Red, QOpenGLTexture::Float32, image->data(), m_transferOptions.get());
break;
default:
break;
}
m_image->generateMipMaps();
@@ -73,6 +72,9 @@ void ImageWidget::setImage(const QPixmap &pixmap)
{
QImage img = pixmap.toImage();
m_imgWidth = pixmap.width();
m_imgHeight = pixmap.height();
m_image->destroy();
m_image->setData(img);
m_image->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear);
@@ -125,6 +127,27 @@ void ImageWidget::setOffset(int dx, int dy)
update();
}
QImage ImageWidget::renderToImage()
{
if(m_imgWidth < 0)return QImage();
makeCurrent();
QOpenGLFramebufferObject fbo(m_imgWidth, m_imgHeight);
fbo.bind();
f->glViewport(0, 0, m_imgWidth, m_imgHeight);
m_program->bind();
m_program->setUniformValue("viewport", (float)m_imgWidth, (float)m_imgHeight);
m_program->setUniformValue("offset", 0.0f, 0.0f);
m_program->setUniformValue("zoom", 1.0f);
m_image->bind(0);
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
fbo.bindDefault();
return fbo.toImage(true);
}
void ImageWidget::paintGL()
{
if(m_blockRepaint)return;
@@ -218,7 +241,7 @@ void ImageWidget::initializeGL()
m_transferOptions->setAlignment(1);
}
ImageScrollAreaGL::ImageScrollAreaGL(QWidget *parent)
ImageScrollAreaGL::ImageScrollAreaGL(QWidget *parent) : QWidget(parent)
{
QGridLayout *layout = new QGridLayout(this);
setLayout(layout);