Mit Dev-C++ Compiler jpg Datein verarbeiten?



  • Hallo,

    versuche seit ein paar Tagen jpg Bilder zu verarbeiten.
    Ich möchte ein Bitmap daraus machen so das ich es Mapen kann
    auf Objekte in meinem Programm.

    Doch es will einfach nicht Funktionieren.

    In der Hauptdatei include ich diese Funktionen und Klassen:

    #include <windows.h>
    #include <mmsystem.h> 
    #include <olectl.h>  
    #include <ocidl.h>
    #include </Programme_Installiert/DirectX_SDK_Marz_2009/Include/dsound.h>  /* DirectSound */
    #include </Programme_Installiert/DirectX_SDK_Marz_2009/Include/ddraw.h>   /* DirectDraw */
    #include "win_sdk/ddutil.h"  /* Speziele Funktionen von Microsoft um Bitmap zu laden */
    

    Diese Funktion habe ich ausgelagert:

    LPPICTURE pPicture;   /* LPCTSTR kann OleLoadPicturePath(...) verarbeiten, CString nicht  */
    long lWidth, lHeight;
    int iWidth, iHeight;
    
    BOOL Bild_Laden(LPCTSTR pszFileName)
    {
      //datei öffnen
      HANDLE hFile = CreateFile(pszFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    
      if(INVALID_HANDLE_VALUE == hFile)
       return FALSE;
    
      //datei größe ermitteln
      DWORD dwFileSize = GetFileSize(hFile, NULL);
    
      //speicher in größe der datei allokieren
      HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
      LPVOID  pvData  = GlobalLock(hGlobal);
    
      //datei lesen u. im speicher behalten
      DWORD dwBytesRead = 0;
      BOOL  bRead       = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
    
      if(!bRead)
       return FALSE;
    
      GlobalUnlock(hGlobal);
      CloseHandle(hFile);
    
      //IStream* aus dem speicher erzeugen
      LPSTREAM pstm = NULL;
      HRESULT  hr   = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
    
      //IPicture vom bild erzeugen
      if(pPicture)
          pPicture->Release();
    
      hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID*)&pPicture);
      pstm->Release();
    
      //breite u. höhe vom bild holen
      pPicture->get_Width(&lWidth);
      pPicture->get_Height(&lHeight);
    
      HDC hdc = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
    
      //in Pixel konvertieren
      iWidth = (lWidth  * GetDeviceCaps(hdc, LOGPIXELSX)) / 2540;
      iHeight = (lHeight * GetDeviceCaps(hdc, LOGPIXELSY)) / 2540;
    
      return true;
    }
    

    Dan Lade ich in der WinMain vor der Schleife das Bild:

    Bild_Laden("/CC++ Test/Direct_X/direct_x_fenster_02/test.jpg");
    

    und dann wollte ich es in der WinMain in der Schleife
    in den BackPuffer legen:

    lpddsBack->Blt(&bild_map, pPicture , NULL, DDBLT_WAIT | DDBLT_KEYSRC , NULL );
    

    doch dann kommt immer diese Fehlermeldung:

    54 F:\CC++ Test\Direct_X\direct_x_fenster_02\funktion\inhalt_erstellen_anzeigen.h no matching function for call to `IDirectDrawSurface7::Blt(RECT*, IPicture*&, NULL, long int, NULL)'
    

    Ich habe mir auch schon FreeImage heruntergeladen und wollte es damit
    mal ausprobieren:

    #include </CC++ Test/Direct_X/direct_x_fenster_02/win_sdk/FreeImage/Source/FreeImage.h>
    

    Dan kamnen aber tausend Fehlermeldungen 😕
    und ich hab es wieder herrausgenommen.

    Andere Varianten wie zb mit den
    Include Datein:

    #include <afxstr.h>
    #include <atlimage.h>
    

    sind am Anfang gleich gescheitert da ich die Funktionen oder Klassen nicht
    habe um sie einzubinden.

    Ich komme irgendwie an dem Punkt nicht weiter
    vielleicht hat ja jemand eine Idee wie ich es hinbekomme.

    Gruß Meiko



  • Du bist im falsche Forum.
    Dein Beitrag wird hoffentlich bald verschoben (WinAPI wäre wahrscheinlich besser).

    Simon



  • Bin noch neu hier wusste nicht so
    recht wo es rein passt :-).
    Bitte einmal schieben Admin Danke 👍



  • Du kannst ein "IPicture" einfach nicht mit IDirectDrawSurface7::Blt blitten.
    Du musst eine Surface erstellen, und dann irgendwie das Bild in diese Surface bekommen. Dann kannst du diese Surface verwenden um zu blitten.

    Wo hast du denn diesen Code her? Bzw. wie kommst du auf die Idee dass es so gehen könnte?

    p.S.: ein Bild bekommst du am einfachsten in eine Surface, indem du die einen DC von der Surface holst, und dann mit den ganz normalen GDI Funktionen da reinmalst. Da sollte es auch Funktionen geben die ein IPicture in einen DC malen können.



  • Hallo hustbaer,

    die Informationen habe ich über google gefunden und ein
    wenig herumprobiert weil es in Normalzustand nicht ging.
    Hast du einen Script für mich der geht?

    Ich hab mein Programm jetzt um eine Funktion erweitert:

    BOOL Bild_anzeigen(HWND hwnd)
    { 
      HDC hdc = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);  
      if(pPicture) //wenn bild geladen
      {
       RECT rc;
       GetClientRect(hwnd, &rc);
    
       //Bild anzeigen mittels Render
       pPicture->Render(hdc, 0, 0, iWidth, iHeight, 0, lHeight, lWidth, -lHeight, &rc);
    
       return TRUE;
      }
    
      return FALSE;
    }
    

    Dan schreibe ich anstatt diesem:

    lpddsBack->Blt(&bild_map, pPicture , NULL, DDBLT_WAIT | DDBLT_KEYSRC , NULL );
    

    das hin:

    Bild_anzeigen(hwnd);
    

    Das Programm wird dann auch erfolgreich Kompiliert aber
    es passiert nichts 😕
    Wie komme ich zu meinem Bild?



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • hab gerade einen Anderen Weg entdeckt wie ich es auch Lössen könnte
    mit dieser Funktion:

    D3DXCreateTextureFromFile( )
    

    es lassen sich aber die dafür nötigen Funktionen und Klassen nicht
    in meinem wxDev-C++ Compiler laden.

    #include </Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h>
    

    Diese Fehlermeldungen kommen dann immer:

    Compiler: Default GCC compiler
    Building Makefile: "F:\CC++ Test\Direct_X\Makefile.win"
    Führt  make... aus
    mingw32-make.exe -f "F:\CC++ Test\Direct_X\Makefile.win" all 
    g++.exe -c direct_x_fenster_02/direct_x_fenster_02.cpp -o Objects/MingW/direct_x_fenster_02.o -I"F:/Programme_Installiert/DevC++/Dev-Cpp/lib/gcc/mingw32/3.4.5/include" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/c++/3.4.5/backward" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/c++/3.4.5/mingw32" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/c++/3.4.5" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/3rdparty/wx/plotctrl" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/3rdparty/wx/sheet" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/3rdparty/wx/treemultictrl" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/3rdparty/wx/things" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/3rdparty/wx" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/3rdparty" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/msw" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/generic" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/fl" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/gizmos" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/html" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/mmedia" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/net" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/ogl" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/plot" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/protocol" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/stc" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/svg" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/xml" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx/xrc" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common/wx" -I"F:/Programme_Installiert/DevC++/Dev-Cpp/include/common" -D__WXMSW__ -D__GNUWIN32__ -D__WIN95__ -DWXUSINGDLL -fno-exceptions -fno-pcc-struct-return -fstrict-aliasing -Wall -D__WXMSW__ -D__GNUWIN32__ -D__WIN95__   -fexpensive-optimizations -O3
    
    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3d9.h:260,
                     from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:46,
    
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3d9types.h:25: warning: ignoring #pragma warning 
    
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3d9types.h:2007: warning: ignoring #pragma warning 
    
    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:46,
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3d9.h:1986:1: warning: "/*" within comment
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3d9.h:1987:1: warning: "/*" within comment
    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:47,
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.h:19: warning: ignoring #pragma warning 
    
    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.h:1787,
                     from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:47,
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.inl: In static member function `static void* _D3DXMATRIXA16::operator new(size_t)':
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.inl:993: warning: `operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)
    
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.inl: In static member function `static void* _D3DXMATRIXA16::operator new [](size_t)':
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.inl:1008: warning: `operator new' must not return NULL unless it is declared `throw()' (or -fcheck-new is in effect)
    
    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:47,
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.h: At global scope:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9math.h:1792: warning: ignoring #pragma warning 
    
    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:48,
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9core.h:669:1: warning: multi-line comment
    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:51,
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9shader.h:955: error: `DECLSPEC_DEPRECATED' does not name a type
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9shader.h:964: error: `DECLSPEC_DEPRECATED' does not name a type
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9shader.h:980: error: `DECLSPEC_DEPRECATED' does not name a type
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9shader.h:990: error: `DECLSPEC_DEPRECATED' does not name a type
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9shader.h:1007: error: `DECLSPEC_DEPRECATED' does not name a type
    
    mingw32-make.exe: *** [Objects/MingW/direct_x_fenster_02.o] Error 1
    
    Ausführung beendet
    Compilation Failed. Make returned 2
    

    Kann es sein das der wxDev-C++ für DirectX Programmierung nicht geeignet ist?



  • Schon die erste Warnung sollte doch heißen daß der Dev-C++ Compiler nicht korrekt mit den #pragma Statements in den Headerfiles umgehen kann:

    Meiko schrieb:

    In file included from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3d9.h:260,
                     from /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3dx9.h:46,
    
                     from direct_x_fenster_02/direct_x_fenster_02.cpp:43:
    /Programme_Installiert/DirectX_SDK_Marz_2009/Include/d3d9types.h:25: warning: ignoring #pragma warning
    

    Kann es sein das der wxDev-C++ für DirectX Programmierung nicht geeignet ist?

    ich denke mal, daß das gar nichts mit DirectX / Direct3D zu tun hat, sondern schlicht und einfach Dein Dev-C++ Compiler (hoffnungslos) veraltet ist.

    Im prinzip hast Du hier nur noch zwei Möglichkeiten:
    - Die Headerfiles so umschreiben, daß sie der Dev-C++ Compiler versteht (viel Arbeit, und noch viel mehr Arbeit bei der Fehlersuche wenns nicht auf Anhieb funktioniert!)
    - Die bessere Alternative: Aktuellere Entwicklungsumgebungen verwenden (z.B. Borland C++ Builder oder Visual C++ 2008 Express Edition, meinetwegen auch den alten Visual C++ 6)

    Martin



  • Hi Martin,

    ich Arbeite mit der neusten Version vom Dev-C++ Compiler,
    Version 7.0 RC5. Einen neueren gibt es nicht.

    Also kann man davon ausgehen das der wxDev-C++ nicht
    geeignet ist für DirectX Programmierung.

    Die Entwicklungsumgebungen die du genannt hast sind natürlich
    Top da gibt es nix aber sie kosten auch eine Stange Geld.
    Der wxDev-C++ ist dagegen kostenlos.

    Gibt es den noch andere alternativen die Kostenlos sind
    mit denen man ohne Probleme DirectX Programmieren kann?

    Gruß Meiko



  • Meiko schrieb:

    Die Entwicklungsumgebungen die du genannt hast sind natürlich
    Top da gibt es nix aber sie kosten auch eine Stange Geld.

    Das stimmt nicht. Die Express Edition von MS VC 2008 ist tatsächlich kostenlos. Dazu brauchst du dann noch das Platform SDK, damit du sinnvoll Windowsprogramme basteln kannst. Näheres hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-143003.html
    Das DirectX-SDK kannst du dann analog zum PSDK installieren.



  • Hallo Martin,

    habe die anderen Entwicklungsumgebungen versucht bei mir auf Arbeit zu
    Installieren aber es geht leider nicht nur der Dev-C++ Compiler
    läßt es zu sich zu Installieren ohne Administrator rechten.
    Daher bleibt mir nur der Dev-C++ Compiler zur verfügung
    außer ich kann den Admin mal überzeugen ;-).

    Die Funktion wie ich sie Oben geschrieben habe scheint
    ja zu Funktionieren das Bild wird geladen doch
    wie bekomme ich das bild wieder zu fassen?
    Die Funktion Bild_anzeigen(hwnd); Funktioniert nicht.

    Ist sie Falsch geschrieben wen ja wie komme ich an
    mein Bild ran?

    gruß Meiko





  • Meiko schrieb:

    ...bei mir auf Arbeit...
    ...außer ich kann den Admin mal überzeugen ;-)...

    Wenn du das für die Arbeit brauchst - wovon ich ausgehe - sag dem Admin, dass es ein essentielles Werkzeug ist und er es installieren muss, damit du deine Arbeit machen kannst. Sage ihm, dass du dies auch gerne deinen Vorgesetzen mitteilen würdest, sollte er es nicht einsehen 🙂

    So klappte das bei mir. Mittlerweile habe ich eine Developermachine, wo ich selbst Admin bin. Ist streßfreier...


Anmelden zum Antworten