Bild aus einer JPG-Datei in einem PictureControl anzeigen



  • CString csFileName="pic\\verstellung band 2.jpg";
    	Gdiplus::Image *img = Gdiplus::Image::FromFile(csFileName);
    	Gdiplus::Bitmap *pBitmap = static_cast<Gdiplus::Bitmap*>(img->Clone());
    	HBITMAP hBitmap = NULL;
    	delete img;
    	Gdiplus::Status status = pBitmap->GetHBITMAP(Gdiplus::Color(0,0,0), &hBitmap);
    	delete pBitmap;
    

    geht net ... weil keine konvertierung möglich ist ...
    genausowenig geht:
    Gdiplus::Image *img = Gdiplus::Image::FromFile((WCHAR)csFileName);
    Gdiplus::Image *img = Gdiplus::Image::FromFile((WCHAR*)csFileName);

    ka schreib doch ma wie das aussehn soll



  • Unicode ist dir ein Begriff?

    CString csFilename = _T("C:\\MeinBild.jpg");
    

    Ansonsten geht auch (nicht Unicode):

    WCHAR *szFilename = L"C:\\MeinBild.jpg";
    CStringW csFilename = L"C:\\MeinBild.jpg";
    

    Wobei gilt:
    _T("") wird je nach Build durch nix oder durch L ersetzt. L bedeutet Literal erstellt dir einen 2Byte String. Ansonsten kannst du in nicht-Unicode Builds auch mit MultiByteToWideChar arbeiten. Oder explizit CStringW verwenden.



  • Gdiplus::Bitmap *pBitmap = static_castGdiplus::Bitmap\*(img->Clone());

    hmmm also bei mir stürzt mein programm bei dieser zeile ab



  • Hast du abgecheckt, ob img ein gültiger Zeiger ist? Vielleicht kann er ja das File nicht finden. Dieser Code funktioniert ansonsten einwandfrei. Hab ich schon lange so im Einsatz. GDI+ muss natürlich initialisiert sein.



  • sorry aber GDI+ sagt mir so nichts... hab das eben zum ersten mal gehört ... wie soll ich das initiallisieren ? also brauch das irgendwelche includes oder wie ?

    edit:
    #include <gdiplus.h>
    #include <windows.h>

    hab ich gefunden das man die includieren muss nur auch damit geht es nicht



  • Source2702 schrieb:

    GDI+ muss natürlich initialisiert sein.

    Wäre ja nett gewesen, wenn Du das bereits im ersten Post erwähnt hättest, das man GDI+ initialisieren und linken muss.

    Dann ist es aber wohl auch leicht zu finden:

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms533798(v=vs.85).aspx

    Beispiel:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms533895(v=vs.85).aspx



  • so also er stürzt immer noch ab, ich hab bisher folgendes gemacht:

    // CVerstell-Meldungshandler
    
    #include <gdiplus.h>
    #include <windows.h>
    #include <objidl.h>
    using namespace Gdiplus;
    
    #pragma comment (lib,"Gdiplus.lib")
    
    BOOL CVerstell::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	WCHAR *szFilename = L"C:\\verstellung_band_2.jpg";
    
    	Gdiplus::Image *img = Gdiplus::Image::FromFile(szFilename);
    	Gdiplus::Bitmap *pBitmap = static_cast<Gdiplus::Bitmap*>(img->Clone());
    	HBITMAP hBitmap = NULL;
    	delete img;
    	Gdiplus::Status status = pBitmap->GetHBITMAP(Gdiplus::Color(0,0,0), &hBitmap);
    	delete pBitmap;
    
    	m_pic.SetBitmap(hBitmap);
    	m_pic.RedrawWindow();
    
    	i=0;
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    

    wieso stürzt das programm bei der zeile immer noch ab?

    Gdiplus::Bitmap *pBitmap = static_cast<Gdiplus::Bitmap*>(img->Clone());
    


  • LordTerra schrieb:

    so also er stürzt immer noch ab, ...

    Gdiplus::Image *img = Gdiplus::Image::FromFile(szFilename);
    	Gdiplus::Bitmap *pBitmap = static_cast<Gdiplus::Bitmap*>(img->Clone());
    

    wieso stürzt das programm bei der zeile immer noch ab?

    Nullzeiger ?

    Welchen Wert hat img ?

    Ich würde sicherstellen, das img und pbitmap gültige Zeiger sind.



  • ok scheinbar ist img = NULL das ist natürlich net gut, aber wie kann ich das ändern ? bzw was ist an meiner zeile
    Gdiplus::Image *img = Gdiplus::Image::FromFile(szFilename);
    falsch?



  • Ich gehe mal davon aus, dass die Datei auch wirklich existiert. Hast du Gdi+ initialisiert?

    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
    

    Macht man z.B. in InitInstance.



  • ok wenn ich die 2 zeilen hinzufüge will er m_gdiplusToken irgendwie initialisieren
    welchen datentyp braucht denn nun diese variable?

    edit:
    ULONG_PTR muss es sein ok
    ich glaub ich habs...



  • #include <gdiplus.h>
    #include <windows.h>
    #include <objidl.h>
    using namespace Gdiplus;
    
    #pragma comment (lib,"Gdiplus.lib")
    
    BOOL CVerstell::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	ULONG_PTR m_gdiplusToken;
    	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    	Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);	
    
    	WCHAR *szFilename = L"pic\\verstellung band 2.jpg";
    
    	Gdiplus::Image *img = Gdiplus::Image::FromFile(szFilename);
    
    	if(img!=NULL){
    		Gdiplus::Bitmap *pBitmap = static_cast<Gdiplus::Bitmap*>(img->Clone());
    		HBITMAP hBitmap = NULL;
    		delete img;
    		Gdiplus::Status status = pBitmap->GetHBITMAP(Gdiplus::Color(0,0,0), &hBitmap);
    		delete pBitmap;
    
    		m_pic.SetBitmap(hBitmap);
                    m_pic.RedrawWindow();
    	}
    
    	i=0;
    
    	return TRUE;  // return TRUE unless you set the focus to a control
    	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
    }
    

    ok so funktioniert es
    m_pic ist mein PictureControl

    vielen dank für die hilfe.



  • so jetzt noch eine kleine letzte frage:

    konvertierung:

    ursprünglich:
    WCHAR *szFilename = L"pic\\verstellung band 2.jpg";

    jetzt möchte ich gern:
    CString filename="test.jpg";

    WCHAR *szFilename = filename; <--- das geht natürlich nicht hier benötige ich die hilfe



  • Das GdiPlusStartup solltest du nur 1x aufrufen. Eben wie geschrieben in InitInstance.

    Statt CString nimmst du explizit CStringW.
    Also z.B.:

    CStringW csFileName = "C:\\Test.jpg";
    Gdiplus::Image *img = Gdiplus::Image::FromFile(csFileName);
    


  • ok thx so gings 🙂 dank euch


Anmelden zum Antworten