Save image into file
This commit is contained in:
+34
-11
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user