LibPNG png_write_info verursacht Access Violation Exception
-
Hi Leute,
einen schönen Samstag erstmal gerade arbeite ich daran eine Art hochauflösenden Screenshot einer OpenGL Scene zu speichern. Das Segmentieren und Lesen der Daten usw. klappt auch soweit, nur macht mir LibPNG im Moment Probleme, was ich nutzen wollte um die resultierenden Daten als png zu speichern.
Leider stürzt mein Programm beim Schreiben der Meta-Daten ab. Genauer gesagt löst LibPNG eine "System.AccessViolationException" aus. Das ganze geschieht in folgender Library interner Funktion:void PNGCBAPI png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check; if (png_ptr == NULL) return; check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); if (check != length) png_error(png_ptr, "Write Error"); }
an der Stelle:
check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
Das Ganze wird aus folgenden Funktionen aufgerufen(Eine Funktion ruft die nächste auf, dann diese wieder die nächste usw.):
1. Meine Funktion(weiter unten)
2. png_write_info
3. png_write_info_before_PLTE
4. png_write_sig
5. png_default_write_data(siehe Oben)
Laut dem Visual Studio 2013 enthaltenem Debugger hat der png_bytep(= char*) data den Wert 0x0032e268 - "‰PNG8ÅÀˆâ2".
Hier noch kurz der Code aus meiner Funktion:FILE *File = fopen(FileName, "wb"); //w = write or create, b = binary if (File == NULL) { return false; } png_structp PngWriteStructPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (PngWriteStructPtr == NULL) { if (File != NULL) { fclose(File); } return false; } png_infop PngInfoPtr = png_create_info_struct(PngWriteStructPtr); if (PngInfoPtr == NULL) { if (File != NULL) { fclose(File); } if (PngWriteStructPtr != NULL) { png_destroy_write_struct(&PngWriteStructPtr, (png_infopp)NULL); } return false; } if (setjmp(png_jmpbuf(PngWriteStructPtr))) { if (File != NULL) { fclose(File); } if (PngInfoPtr != NULL) { png_free_data(PngWriteStructPtr, PngInfoPtr, PNG_FREE_ALL, -1); } if (PngWriteStructPtr != NULL) { png_destroy_write_struct(&PngWriteStructPtr, (png_infopp)NULL); } return false; } int width = 1000, height = 500; //Eigentlich zuvor berechnete Werte, aber das tut jetzt nichts zur Sache png_init_io(PngWriteStructPtr, File); png_set_IHDR(PngWriteStructPtr, PngInfoPtr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(PngWriteStructPtr, PngInfoPtr);
Danke schon mal im Voraus
MfG
DragonRaider
-
-
Danke, hab ich nach ein wenig Googlen mit anderen Suchbegriffen auch gefunden xD danke auch an das Team hinter dieser Website - hat mir sehr geholfen.