jpg



  • Hallo zusammen, ich habe mir einen Scanner zugelegt, der JPEG Dateien produziert. Kann ich diese auch mit den MFC weiterverarbeiten ? zB in ein CBitmap-Objekt laden, und auf dem Bildschirm anzeigen, oder auf dem Drucker drucken ? Gegoogelt habe ich schon, ohne Erfolg. Kann man womöglich JPEG Dateien, in BMP Dateien konvertieren ?



  • s. CImage



  • Danke Th69, ich habe noch folgendes gefunden:

    CImage image;
    image.Load(_T("C:\\image.png")); // statt png müsste auch jpg gehen ...
    CBitmap bitmap;
    bitmap.Attach(image.Detach());



  • und warum das ganze erst aus CImage in ein CBitmap laden?

    Ich geh mal davon aus das du das ganze anzeigen willst und dafür musst du das doch eh in der OnPaint zeichnen, da kannst du das aber auch gleich mit CImage zeichnen lassen und speichern geht dann genau so darüber.


  • Mod

    Und vor allem mit weitaus weniger Speicher...



  • In meinen Büchern, steht nichts über CImage. Sie sind veraltet. Leider gibt es keine aktuellen Bücher. Lernen tut man eben am besten mit Literatur. Bei C++ 6.0 gibt es glaube ich keine CImage Klasse. Aber Danke für Eure Mühe ...



  • Äh, C++ 6.0??? Das ist von 1998: Visual C++: Versionsgeschichte

    Besorge dir die Visual Studio Community Edition (da ist auch die MFC dabei).


  • Mod

    Was hast Du für Bücher? 😉

    CImage kam später mit der ATL.
    Ansonsten kannst Du locker auch OleCreatePictureIndirect or OleLoadPictureEx verwenden. Es gibt 100 Möglichkeiten.



  • Arbeiten tue ich mit VS Standard 2008, und VS Professional 2010, C++ MFC. Die Bücher die ich gekauft habe reichen nur bis C++ 6.0, dort kann man das nachschlagen, was seit 6.0 immer noch gilt. Aber sonst habe ich nur die MSDN, mit den Members und den Beispielen. Da bräuchte man einen Martin Richter, der zwei dicke Bände über C++ MFC, mit allen Neuigkeiten schreibt, und gut verkauft ! Darauf wartet schon die ganze Entwicklungs-Gemeinde ... nichts für ungut !



  • Na ich würde sagen C++ 6.0 ist schon so Stein alt das es als Grundlage eher ungeeignet ist. Es gibt für viele Sachen schon besseres als was man da findet bzw. sind einige Sachen schon gar nicht mehr so implementiert. Wie aber auch immer, das es keine aktuellen Bücher zur MFC gibt ist auch richtig, da will keiner mehr ran.

    Aber vielleicht hilft die CodeProject weiter, da findet man eigentlich zu fast jeden Problem eine Lösung und kann nebenbei noch viel lernen 😉



  • Danke Euch !



  • Es heißt "Visual C++ 6.0". "C++ 6.0" gibt es nicht.



  • Jetzt doch noch etwas, ich arbeite mit VS 2008 Standard, wenn ich ein CImage deklariere: CImage img; kommt die Compilerfehlermeldung: CImage nicht deklarierter Bezeichner ! Allerdings ist CImage im lokalen Hilfesystem verzeichnet! Muss man irgendeine Headerdatei miteinbeziehen ? Wenn ja welche ?



  • Sorry ich habe es bisher nicht gefunden, man muss #include "atlimage.h" eintragen.



  • Wo sollte man die #include-Anweisung unterbringen ? bei stdafx.h ? dann würde sie doch mehrfach einbezogen werden, weil stdafx.h bei jeder cpp Datei includiert wird ? Oder überall wo man CImage braucht ? Gegoogelt habe ich schon, ohne Erfolg. Vielleicht unzureichend ...


  • Mod

    Wie Du es willst und es zu Deinem Design passt... 😉



  • Danke Martin !



  • Das kannst Du über die OleLoadPicture erreichen damit kannst Du verschiedene
    Formate laden, aber ohne kentznisse der DibSectionen und dem BitmapHandling hast Du keine changes an dem Spiel teilzunehmen. Also erstmal das Thema
    HAL durch sehen HAL = HardwareAbstractionLayer.

    Deine Freunde sind dann CreateDibSection DrawDibDraw und konsorten..

    Pseudo Code zum laden von jpg tif usw..

    // Use IPicture stuff to use JPG / GIF files
       IPicture* pPicture = 0;
       IStream* pStream   = 0;
       LPBYTE   hG        = 0;
    
       DWORD fs = Size;
       hG = (LPBYTE) HeapAlloc( GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, fs);
       if(!hG)
        return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant alloc processheap for image stream\n");
    
      // memcpy(hG,pMem,fs);
    
       HRESULT hRes = ::CreateStreamOnHGlobal(hG,false,&pStream);// Create an IStream so IPicture can 
       if(hRes != S_OK)
       {
        HeapFree(GetProcessHeap(), 0, hG);
        return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant CreateStreamOnHGlobal\n");
       }
    
       hRes = ::OleLoadPicture(pStream,fs,TRUE,IID_IPicture,(void**)&pPicture);
    
       if(hRes != S_OK)
       {
    	  pStream->Release();
          HeapFree(GetProcessHeap(), 0, hG);
          return CVersions::DbgMsg(false,"error: Dib:StreamToPic cant OleLoadPicture\n");
       }
    
       short type;pPicture->get_Type(&type);
       if(type == PICTYPE_BITMAP)
       {
    		HBITMAP hBmp = 0;
    		hRes = pPicture->get_Handle( (OLE_HANDLE* )&hBmp);//Retrive GDI Object 
    
    		if (hRes == S_OK)
    		{
    			CDib::Draw(hBmp, Flip);
    		}else CVersions::DbgMsg(false,"error: Dib:StreamToPic get_Handle\n");
    
    		if(hBmp)
             ::DeleteObject(hBmp);
       }
    
       if(pStream)
        pStream->Release();
    
       if(hG)
    	  HeapFree(GetProcessHeap(), 0, hG);
    
       if(pPicture)
        pPicture->Release();
    
       return (hRes == S_OK);
    


  • Ist: CImage image; image.Load(_T("C:\\image.jpg")); nicht einfacher ?



  • Java ist einfacher


Anmelden zum Antworten