Re: How to create my own QPixmap Or QImage
try to inspect this code.
it use QPainter to draw image in widget from ROI (Region Of Interests) on image.
it works on video card, so, you don't need to resize image on CPU when it scrolled. This code just draw the part of image to widget rect.
imagewidget.h
Code:
#ifndef IMAGEMODEL_H
#define IMAGEMODEL_H
#include <QObject>
#include <QWidget>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QResizeEvent>
#include <QPainter>
#include <QDebug>
#include <QAbstractSlider>
{
Q_OBJECT
public:
explicit ImageWidget
(QWidget *parent
);
void setImage
(QImage* image,
bool bResetRoi
);
public slots:
void on_setVScrollValue(int value);
void on_setHScrollValue(int value);
signals:
private:
};
#endif // IMAGEMODEL_H
imagewidget.cpp
Code:
#include "imagewidget.h"
QImage ImageWidget
::defaultImage() {
painter.
setPen(QPen(Qt
::black));
painter.
setBrush(QBrush(Qt
::black,Qt
::SolidPattern));
return img;
}
ImageWidget
::ImageWidget(QWidget* parent
){
m_roi = rect() - contentsMargins();
if(m_roi.width() > m_roi.height())
m_borders.
setSize(QSizeF(m_roi.
width(),m_roi.
width()));
else
m_borders.
setSize(QSizeF(m_roi.
height(),m_roi.
height()));
qDebug()<<m_roi;
}
void ImageWidget
::setImage(QImage *image,
bool bResetRoi
) {
if(!image) return;
if(!bResetRoi)
{
m_img = *image;
update();
return;
}
m_img = *image;
qDebug()<<m_roi;
m_borders.setSize(m_img.size() * 1.2);
m_borders.moveCenter(m_img.rect().center());
update();
}
{
return m_roi;
}
void ImageWidget
::setRoi(QRectF newRoi
) {
bool bNormal = true;
if(newRoi.height() < m_borders.height())
{
if(newRoi.top() < m_borders.top())
{
newRoi.moveTop(m_borders.top());
bNormal = false;
}
if(newRoi.bottom() > m_borders.bottom())
{
newRoi.moveBottom(m_borders.bottom());
bNormal = false;
}
}
else
{
newRoi.
moveCenter(QPointF(newRoi.
center().
x(),
m_borders.center().y())
);
}
if(newRoi.width() < m_borders.width())
{
if(newRoi.left() < m_borders.left())
{
newRoi.moveLeft(m_borders.left());
bNormal = false;
}
if(newRoi.right() > m_borders.right())
{
newRoi.moveRight(m_borders.right());
bNormal = false;
}
}
else
{
newRoi.
moveCenter(QPointF(m_borders.
center().
x(),
newRoi.center().y())
);
}
if(!bNormal) emit resetRoi(newRoi);
m_roi = newRoi;
qDebug()<<m_roi;
}
QSize ImageWidget
::getImgSize() {
if(m_img.isNull())
return size();
return m_img.size();
}
void ImageWidget::on_setVScrollValue(int value)
{
m_roi.moveTop(value);
qDebug()<<m_roi;
emit resetRoi(m_roi);
update();
}
void ImageWidget::on_setHScrollValue(int value)
{
m_roi.moveLeft(value);
qDebug()<<m_roi;
emit resetRoi(m_roi);
update();
}
{
if(m_img.isNull())
{
return;
}
if(m_img.
format() == QImage::Format_Invalid) {
return;
}
painter.
setRenderHint(QPainter::SmoothPixmapTransform,
true);
painter.
setRenderHint(QPainter::HighQualityAntialiasing,
true);
blackBrush.
setColor(QColor(Qt
::black));
blackBrush.setStyle(Qt::SolidPattern);
painter.
setBackground(QBrush(Qt
::black));
painter.setBrush(blackBrush);
painter.drawRect(event->rect());
painter.drawImage(event->rect(),m_img,m_roi.toRect());
}
{
}