jpeglib Problem



  • Servus,
    ich versuche schon seit geraumer Zeit ein Programm zu programmieren, dass ein bmp Bild zu einem Jpg konvertiert. Jetzt bin ich auf jpeglib.h gestoßen. Da diese auch für Dev-C++ erhältlich ist, hab ich eigentlich gedacht, dass es keine Probleme geben sollte. Aber als ich dieses Programm kompilierte, stürzte das Programm ab, nachdem ich es ausgeführt hatte:

    #include <stdlib.h>
    #include <windows.h>
    #include <stdio.h>
    
    //#ifdef INT32
    //#undef INT32
    //#endif
    
    #include <jpeglib.h>
    #pragma comment(lib, "jpeglib.lib");
    
    int jpegCapture(char* filename, int quality)
    {
       HBITMAP hBMP;
       HWND desktopWnd;
       int width;
       int height;
       RECT rc;
       HDC hDC;
       HDC hDCmem;
       int posx;
       int posy;
       unsigned char scanline[1000000000];
       JSAMPROW row_pointer[1];	// pointer to JSAMPLE row[s]
    
       struct jpeg_compress_struct cinfo;
       struct jpeg_error_mgr jerr;
       FILE * outfile;
       COLORREF pixel;
    
       // Make capture bitmap
       desktopWnd = GetDesktopWindow();
       GetWindowRect(desktopWnd, &rc);
       width = rc.right - rc.left;
       height = rc.bottom - rc.top;
       hDC = GetDC(desktopWnd);
       hDCmem = CreateCompatibleDC(hDC);
       hBMP = CreateCompatibleBitmap(hDC, width, height);
       if (hBMP == NULL) return -2;
       SelectObject(hDCmem, hBMP);
       BitBlt(hDCmem, 0, 0, width, height, hDC, rc.left, rc.top, SRCCOPY);
    
       // Compress to JPEG using hDCmem
       cinfo.err = jpeg_std_error(&jerr);
       jpeg_create_compress(&cinfo);
       outfile = fopen(filename, "w+b");
       if (outfile == NULL) return -1;
       jpeg_stdio_dest(&cinfo, outfile);
       cinfo.image_width = width;
       cinfo.image_height = height;
       cinfo.input_components = 3;
       cinfo.in_color_space = JCS_RGB;
       jpeg_set_defaults(&cinfo);
       if (quality < 0) quality = 0;
       else if(quality > 100) quality = 100;
       jpeg_set_quality(&cinfo, quality, FALSE);
       jpeg_start_compress(&cinfo, TRUE);
       for (posy = 0; posy < height; posy++) {
          for (posx = 0; posx < width; posx++) {
             pixel = GetPixel(hDCmem, posx, posy);
             scanline[posx*3+0] = GetRValue(pixel);
             scanline[posx*3+1] = GetGValue(pixel);
             scanline[posx*3+2] = GetBValue(pixel);
          }
          row_pointer[0] = &scanline[0];
          (void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
       }
       jpeg_finish_compress(&cinfo);
    
       jpeg_destroy_compress(&cinfo);
       fclose(outfile);
       DeleteDC(hDCmem);
       ReleaseDC(desktopWnd, hDC);
       return 0;
    }
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        jpegCapture("hallo.jpg",75);
        return 0;
    }
    

    Es liegt an den Funktionen der jpeglib.h, aber was der Fehler ist, weiß ich nicht. Die Funktion hab ich von dieser Website "geklaut": http://members.aol.com/OlivThill/savejpg/savejpg1_c.htm

    Bitte keine "Antworten" in Richtungen: "Warum nimmst du kein GDI+?"
    Ich will in C und nicht in C++ programmieren.



  • Warum stellst du die Frage dann im WinAPI Forum wenn es an der jpeglib liegt? Die gehört doch gar nicht zur WinAPI. 😉





  • Ein Fehler ist auf jeden Fall hier:

    unsigned char scanline[1000000000];
    

    Der Stack ist normalerweise nur 1 MB groß.



  • is auch völlig überflüssig



  • außerdem den code ohne comments zu rippen ist auch alles andere als intelligent 👎



  • außerdem steht im orignal unsigned char scanline[2000*3]; bist du zu blöd zum kopieren?



  • Danke, das wars. Ich hab das bloß geändert, weil ich einen anderen Fehler hatte und gemeint hab, dass es daran liegen würde.


Anmelden zum Antworten