TGA-Loader für Qt

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
theprogrammer12
Beiträge: 38
Registriert: 12. August 2009 20:02

TGA-Loader für Qt

Beitrag von theprogrammer12 »

Qt kann einige Formate importieren, aber kein TGA.
Deshalb hier eine kleine Funktion, die genau das macht. Jedoch unterstützt sie keine RLE-Kompression.

Code: Alles auswählen

QPixmap LoadTGAImage(const char *filename)
{
        unsigned char hdr[18];
        unsigned char file_id[256 + 1];
        QImage r;
        int file;

        /* Open file */
        file = open(filename, O_RDONLY);
        if(file < 0)
        {
                printf("Error: Failed to open tga file '%s' for reading", filename);
                return 0;
        }

        /* Read header */
        if(read(file, hdr, 18) != 18 || read(file, file_id, hdr[0]) != hdr[0])
        {
                printf("Error: Unexpected EOF while reading header of '%s'", filename);
                close(file);
                return 0;
        }
        file_id[hdr[0]] = 0;
        if(hdr[1] != 0 || (hdr[2] != 2 && hdr[2] != 3) || (hdr[16] != 8 && hdr[16] != 16 && hdr[16] != 24 && hdr[16] != 32))
        {
                printf("Error: File '%s' has invalid format", filename);
                close(file);
                return 0;
        }
        int width = *(short *)(hdr + 12);
        int height = *(short *)(hdr + 14);
        int components = hdr[16] / 8;

        /* Read image data */
        unsigned char *data = new unsigned char [width * height * components];
        if(read(file, data, width * height * components) != width * height * components)
        {
                printf("Error: Unexpected EOF while reading image data of '%s'", filename);
                close(file);
                return 0;
        }

        /* Check for overlength! */
        char dummy;
        if(read(file, &dummy, 1) == 1)
                printf("Warning: TGA file '%s' has overlength", filename);

        close(file);

        r = QImage(width, height, QImage::Format_RGB32);
        for(int x = 0; x < width; x++)
            for(int y = 0; y < height; y++)
                r.setPixel(x, y, QColor(data[(x + y * width) * components + 2],
                                        data[(x + y * width) * components + 1],
                                        data[(x + y * width) * components + 0]).rgb());

        delete data;        

        return QPixmap::fromImage(r);
}
Ich hab den Original Code für OpenGL von einem Freund bekommen und für Qt umgeschrieben. Ich hoffe, ihr könnt ihn brauchen!

Verbesserungsvorschläge sind natürlich herzlich willkommen!
Zuletzt geändert von theprogrammer12 am 3. Juni 2010 10:21, insgesamt 1-mal geändert.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Wo ist das delte data; ? ^^
Antworten