Bilder C++



  • Und mit welchen Befehl kann ich .jpg laden?



  • Ich bin sogar heute mal so freundlich und gib dir nen Link zu den WinAPI Referenzen...

    http://msdn.microsoft.com/en-us/library/aa139672.aspx

    Such mal nach LoadImage() oder so, da wirst du schon was finden...

    Mfg Wikinger75!



  • Hm, jetzt kommen 5 Errors:
    Aber alle liegen im ersten Teil.

    #include <windows.h>
    #include <stdio.h>
    
    int LoadBmp2Console(char *szBitmap, int PosX, int PosY){
                        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,szBitmap,
    IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
       if (!hBitmap) return 1;
    
       BITMAP bmp;
       GetObject(hBitmap,sizeof(bmp),&bmp);
    
       HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
       if (!hwnd) return 2;
    
       HDC hDC = GetDC(hwnd);
       if (!hDC) return 3;
    
       HDC hBitmapDC = CreateCompatibleDC(hDC);
       if (!hBitmapDC) return 4;
    
       SelectObject(hBitmapDC,hBitmap);
    
       BitBlt(hDC,PosX,PosY,bmp.bmHeight,bmp.bmWidth,hBitmapDC,0,0,SRCCOPY);
    
       DeleteObject(hBitmap);
       ReleaseDC(hwnd,hBitmapDC);
       ReleaseDC(hwnd,hDC);
    
     return 0;
     }
    
     int main()
     {
       int Status = LoadBmp2Console("bitmap.bmp",100,100);
       if(Status!=0)printf("Fehler: %i",Status);
    
       getchar();
       return 0;
     }
    


  • sulpsulpc schrieb:

    Hm, jetzt kommen 5 Errors:

    Ist ja interessant. Und die sollen wir jetzt erraten oder was?



  • Ich schreib sie mal rein:

    Line 10: `undefined reference to `_GetObjectA@12'
    Line 18: `undefined reference to `_CreateCompatibleDC@4'
    Line 21: `undefined reference to `_SelectObject@8'
    Line 23: `undefined reference to `_BitBlt@36'
    Line 25: `undefined reference to `_DeleteObject@4'
    


  • Du musst die Gdi32.lib einbinden.

    In der Hilfe (MSDN) zu jeder Funktion findest du unten immer Angaben, welche Header und libs du brauchst.



  • Bei msdn Habe ich nichts über Gdi32.lib gefunden.
    Gefunden schon, aber keinen Code.
    Ich habe eine Site gefunden, da kann man Gdi32.dll downloaden. Kann ich wirklich auch DLL verwenden?



  • Ich sagte: Hilfe zur Funktion (also nicht nach gdi32.lib suchen, sondern nach einer der Funktionen). Wenn du dir also die Hilfe zu einer der vom Linker bemängelten Funktionen ansiehst, kannst du nachlesen, welche lib du eventuell einbinden musst. Zum Beispiel für BitBlt:

    http://msdn.microsoft.com/en-us/library/dd183370(VS.85).aspx

    Füge diese Zeile deinem Code hinzu:

    #pragma comment (lib, "gdi32.lib")
    

    Dann müsste er die Implementation dieser Funktionen eigentlich auf jeden Fall finden.

    Vielleicht auch interessant für dich zu dem Thema:

    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1358851.html

    Da bin ich selbst über den gleichen Fehler gestolpert. 😃



  • Bei mir kommen immernoch 1 Error bei diesem Code:

    #include <windows.h>
    #include <stdio.h>
    
    int LoadBmp2Console(char *szBitmap, int PosX, int PosY){
       server("Gdi32.lib");
                        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,szBitmap,
    IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
       if (!hBitmap) return 1;
    
       BITMAP bmp;
       GetObject(hBitmap,sizeof(bmp),&bmp);
    
       HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
       if (!hwnd) return 2;
    
       HDC hDC = GetDC(hwnd);
       if (!hDC) return 3;
    
       HDC hBitmapDC = CreateCompatibleDC(hDC);
       if (!hBitmapDC) return 4;
    
       SelectObject(hBitmapDC,hBitmap);
    
       BitBlt(hDC,PosX,PosY,bmp.bmHeight,bmp.bmWidth,hBitmapDC,0,0,SRCCOPY);
    
       DeleteObject(hBitmap);
       ReleaseDC(hwnd,hBitmapDC);
       ReleaseDC(hwnd,hDC);
    
     return 0;
     }
    
     int main()
     {
       int Status = LoadBmp2Console("bitmap.bmp",100,100);
       if(Status!=0)
       {
           printf("Fehler: %i",Status);
       }else{
       getchar();
       }
       return 0;
     }
    

    error: server' was not declared in this scope warning: unused variableserver'



  • server("Gdi32.lib");
    

    Was soll denn diese Zeile?



  • Ja, ok, das sollte

    system("Gdi32.lib");
    

    heißen.



  • Und was willst du damit beabsichtigen?



  • Dass die Gdi32.lib eingebunden wird.
    Bei

    #pragma comment (lib, "gdi32.lib")
    

    kommt immer folgendes: warning: ignored #pragma comment (lib, "gdi32.lib")



  • Ich sehe schon, hier müssen wir ganz vorne beginnen:

    Welchen Compiler und/oder IDE verwendest du?



  • sulpsulpc schrieb:

    Dass die Gdi32.lib eingebunden wird.
    Bei

    #pragma comment (lib, "gdi32.lib")
    

    kommt immer folgendes: warning: ignored #pragma comment (lib, "gdi32.lib")

    Ich würde eigentlich vermuten, dass diese Warnung bedeutet, dass die lib bereits eingebunden wird (siehe auch mein geposteter Link, Thema Standard-libs). Wieso dann allerdings BitBlt und Konsorten nicht gefunden werden, ist mir schleierhaft. Irgendwas musst du so richtig falsch machen. 😉

    Vielleicht könnte es helfen, mal ein neues, minimales Projekt zu erzeugen und dort mal eine der Funktionen versuchsweise aufzurufen (z.B. DeleteObject). Wenn das dann problemlos klappt, kannst du anfangen, nach Unterschieden zu suchen.



  • Ich Poste hier ganz einfach mal meinen Code:

    #include <windows.h>
    #include <stdio.h>
    
    int LoadBmp2Console(char *szBitmap, int PosX, int PosY){
        system("Gdi32.lib");
                        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,szBitmap,
    IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
       if (!hBitmap)
       {
            return 1;
       }
    
       BITMAP bmp;
       GetObject(hBitmap,sizeof(bmp),&bmp);
    
       HWND hwnd = FindWindow("ConsoleWindowClass",NULL);
       if (!hwnd)
       {
           return 2;
       }
    
       HDC hDC = GetDC(hwnd);
       if (!hDC)
       {
            return 3;
       }
    
       HDC hBitmapDC = CreateCompatibleDC(hDC);
       if (!hBitmapDC)
       {
           return 4;
       }
    
       SelectObject(hBitmapDC,hBitmap);
    
       BitBlt(hDC,PosX,PosY,bmp.bmHeight,bmp.bmWidth,hBitmapDC,0,0,SRCCOPY);
    
       DeleteObject(hBitmap);
       ReleaseDC(hwnd,hBitmapDC);
       ReleaseDC(hwnd,hDC);
    
     return 0;
     }
    
     int main()
     {
       int Status = LoadBmp2Console("bitmap.bmp",100,100);
       if(Status!=0)printf("Fehler: %i",Status);
    
       getchar();
       return 0;
     }
    


  • Der Code bringt ja nix (außer, dass man dich noch mal auf diese grausige system-Anweisung aufmerksam machen kann 😉 ). Das ist ein Linker-Problem (er findet z.B. die Implementation der Funktion BitBlt nicht), und da ist eigentlich nur wichtig, ob und wie du die betreffende lib eingebunden hast. Na ja, und windows.h, aber den hast du ja (und der versteht sich auch von selbst).

    Wie gesagt, mach mal ein neues Projekt und versuch, DeleteObject auszuführen. Klappt das?



  • Ich glauber er
    - Weis nicht was ein Compiler eigentlich tut
    - Hat keine Ahnung was ein Linker ist
    - Kennt den Unterschied zwischen .lib und .dll nicht.

    -> Vielleicht wäre es besser zu Java/C#/oder anderer Sprache mit RAD wechseln.


Anmelden zum Antworten