QImageを利用してQGLWidgetに画像を描画する
QImageクラス
QImageはpngやjpgなどいくつかのフォーマットの画像を読み込んでRawデータを保持することができるクラスです。
利用するときはqimage.hをインクルードすればよいです。
#include <qimage.h>
画像の読み込み
loadメソッドを使います。
QImage img; bool ret = img.load("icon.png"); if ( !ret ) { // error }
OpenGL形式への変換
OpenGLのAPIで利用できるフォーマットに変換するには、convertToGLFormatメソッドを利用します。(静的メソッドなので注意)。変換後は例えばglTexImage2DやglDrawArrayで利用できます。
画像幅width(), 画像の高さheight(), バッファアドレスbit()以外の動作は保証できないので、一旦変換してしまうと通常のQImageとしては使えないようです。またフォーマットはGL_RGBAを指定しておきます。
QImage img;
img.load("icon.png");
QImage glimg = QGLWidget::convertToGLFormat( img );
glDrawPixels( img.width(), img.height(), GL_RGBA, GL_UNSIGNED_BYTE, glimg.bits() );
QGLWidgetへの描画
以下、簡単な実装例です。
CanvasWidget.h
#include <QGLWidget> #include <qimage.h> class CanvasWidget : public QGLWidget{ Q_OBJECT public: explicit CanvasWidget(QWidget *parent = 0 , const char *name = 0); virtual void initializeGL(); virtual void resizeGL( int width, int height ); virtual void paintGL(); private: QImage img; };
CanvasWidget.cpp
#include "canvaswidget.h" #include <qgl.h> CanvasWidget::CanvasWidget(QWidget *parent, const char *name) : QGLWidget(parent){} void CanvasWidget::initializeGL(){ img.load("icon.png"); // check load error here int width = geometry().width(); int height = geometry().height(); glViewport( 0, 0, width, height ); glMatrixMode(GL_PROJECTION); glOrtho( -width * 0.5, width * 0.5, -height * 0.5, height * 0.5, -1.0, 1.0 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ); } void CanvasWidget::resizeGL( int width, int height ){ glViewport( 0, 0, width, height ); } void CanvasWidget::paintGL(){ glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); QImage glimg = QGLWidget::convertToGLFormat( img ); glDrawPixels( img.width(), img.height(), GL_RGBA, GL_UNSIGNED_BYTE, glimg.bits() ); }
main.cpp
#include <qapplication.h> #include "canvaswidget.h" int main( int argc, char **argv ){ QApplication app(argc, argv); CanvasWidget widget; widget.setGeometry( 100, 100, 200, 300 ); widget.show(); return app.exec(); }