Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.09.2017, 18:38

c++ (VS 1015) PNG mit libPNG und zlib

Hallo zusammen.

Ich versuche gerade eine leseroutine für Texturen aus PNG`s erstellen und nutze hierfür libPNG und zLib.

Bei setjmp steigt die Routine immer aus.
Der Header des PNG-files ist auch OK.

137,80,78,71,13,10,26,10.

Hier mein Quellcode bis zur besagten Stelle.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    png_byte Header[8];

    FILE *myFile = fopen(filename.c_str(), "rb");
    if (myFile == 0)
    {
        return 0;
    }

    fread(Header, 1, 8, myFile);

    if (png_sig_cmp(Header, 0, 8))
    {
        fclose(myFile);
        return 0;
    }

    png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (!png_ptr)
    {
        fclose(myFile);
        return 0;
    }

    png_infop info_ptr = png_create_info_struct(png_ptr);
    if (!info_ptr)
    {
        png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
        fclose(myFile);
        return 0;
    }

    png_infop end_info = png_create_info_struct(png_ptr);
    if (!end_info)
    {
        png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
        fclose(myFile);
        return 0;
    }

    if (setjmp(png_jmpbuf(png_ptr))) {
        png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
        fclose(myFile);
        return 0;
    }


Kann mir jemand sagen, was ich falsch mache ?

Danke.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

21.09.2017, 19:07

Was heißt "steigt die Routine immer aus"? Dass setjmp einen Nicht-Null-Wert liefert?
Verstehst du, was du da tust? Es kann sein, dass dein Code eigentlich noch weiter läuft, aber irgendwann später ein Fehler in libPNG auftritt, wodurch dann longjmp aufgerufen wird. Dadurch wird zurück zu deinem setjmp-Aufruf gesprungen. Es kann eigentlich nicht sein, dass setjmp beim ersten Aufruf einen Nicht-Null-Wert liefert. Bist du ganz sicher, dass dein Programm nicht weiter läuft und erst später zurückspringt? Setz mal einen Debugger-Breakpoint hinter dem ganzen Code-Block, den du gepostet hast, und schau, ob er nicht doch erreicht wird.

3

21.09.2017, 19:38

Danke für den Tip.

Ich habe festgestellt, dass die Routine bei

png_read_info(png_ptr, info_ptr);

in setjmp zurückspringt.

Hier ist der Rest des Blocks.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    // init png reading
    png_init_io(png_ptr, myFile);

    // let libpng know you already read the first 8 bytes
    png_set_sig_bytes(png_ptr, 8);

    // read all the info up to the image data
    png_read_info(png_ptr, info_ptr);

    // variables to pass to get info
    int bit_depth, color_type;
    png_uint_32 temp_width, temp_height;

    // get info about png
    png_get_IHDR(png_ptr, info_ptr, &temp_width, &temp_height, &bit_depth, &color_type,
        NULL, NULL, NULL);

    // Update the png info struct.
    png_read_update_info(png_ptr, info_ptr);

    // Row size in bytes.
    int rowbytes = png_get_rowbytes(png_ptr, info_ptr);

    // glTexImage2d requires rows to be 4-byte aligned
    rowbytes += 3 - ((rowbytes - 1) % 4);

    // Allocate the image_data as a big block, to be given to opengl
    png_byte * image_data;
    image_data = (png_byte*)malloc(rowbytes * temp_height * sizeof(png_byte) + 15);
    if (image_data == NULL)
    {
        png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
        fclose(myFile);
        return 0;
    }

    // row_pointers is for pointing to image_data for reading the png with libpng
    png_bytep * row_pointers = (png_bytep*)malloc(temp_height * sizeof(png_bytep));
    if (row_pointers == NULL)
    {
        png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
        free(image_data);
        fclose(myFile);
        return 0;
    }

    // set the individual row_pointers to point at the correct offsets of image_data
    unsigned int i;
    for (i = 0; i < temp_height; i++)
    {
        row_pointers[temp_height - 1 - i] = image_data + i * rowbytes;
    }

    // read the png into image_data through row_pointers
    png_read_image(png_ptr, row_pointers);

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

22.09.2017, 10:57

Meine Suche hat das hier ergeben: https://stackoverflow.com/questions/2277…n-png-read-info
Vielleicht hilft dir das.

Werbeanzeige