Qt / OpenGL / Große Bilder / CAD-Daten

Alles rund um die Programmierung mit Qt
Antworten
Tobias
Beiträge: 1
Registriert: 24. April 2008 11:10

Qt / OpenGL / Große Bilder / CAD-Daten

Beitrag von Tobias »

Hallo zusammen.

Ich versuche gerade herauszufinden, wie auf welchem Wege ich mit Qt 4.3.4 unter Linux am besten große Bilder (über 5.000 x 10.000 Pixel) anzeigen kann. 2D ist an dieser Stelle völlig ausreichend für mich. Später möchte ich noch zweidimensionale CAD-Daten (Gebäudegrundrisse etc.) über diese Luftbilder zeichnen. Da das ganze ein Editor werden soll, muss ein schnelles Zoomen und Verschieben aller Daten und somit auch des Bildes möglich sein.

Aktuell habe ich das Anzeigen, Zoomen und Verschieben des Bildes wie folgt in einem QGLWidget implementiert:
- Zerteile das große Bild in 512x512 Pixel-Häppchen
- Packe die Häppchen als jeweils Texturen auf Quadrate, die dann wieder das große Bild darstellen.

Hat jemand einen besseren Vorschlag?

Beste Grüße.

Tobias

Code: Alles auswählen

GLuint GLWidget::makeObject()
{
    const QPixmap background	= QPixmap(QString("Luftbild.png"));
 
    m_numberOfTilesHorizontal	= background.width()/512;
    m_numberOfTilesVertical		= background.height()/512;
    m_numberOfTiles				= m_numberOfTilesHorizontal * m_numberOfTilesVertical;
    m_backgroundTextures		= (GLuint*) malloc(m_numberOfTiles * sizeof(GLuint));

    GLuint list = glGenLists(1);
    glNewList(list, GL_COMPILE);

    for(int i = 0; i < m_numberOfTilesVertical; ++i)
    {
    	for(int j = 0; j < m_numberOfTilesHorizontal; ++j)
    	{
    		 m_backgroundTextures[ m_numberOfTilesHorizontal * i + j ] = bindTexture(background.copy(512*j, 512*i, 512, 512),
    		 											                     GL_TEXTURE_2D,
														                     GL_RGB);
    	}
    }
    
    int x = 0;
    int y = 0;
    glEnable (GL_TEXTURE_2D);
    
    for (int i = 0; i < m_numberOfTiles; ++i)
    {
    	glBindTexture(GL_TEXTURE_2D, m_backgroundTextures[i]);
        
        glBegin (GL_QUADS);
        	glTexCoord2f (		1,		0);
        		glVertex2f (	x + 1,	m_numberOfTilesVertical - y - 1);

        	glTexCoord2f (		1,		1);
        		glVertex2f (	x +1,	m_numberOfTilesVertical - y);

        	glTexCoord2f (		0,	1);
        		glVertex2f (	x ,	m_numberOfTilesVertical - y);

        	glTexCoord2f (		0,	0);
        		glVertex2f (	x ,	m_numberOfTilesVertical - y - 1);
        glEnd ();
        
        ++x;
        if(x >= m_numberOfTilesHorizontal)
        {
        	x = 0;
        	++y;
        }
    }
    
    glDisable (GL_TEXTURE_2D);
    glEndList();
    return list;
}
Antworten