Bild aus einer JPG-Datei in einem PictureControl anzeigen
-
moin
ich versuche grad krampfhaft ein JPG Bild in einem PictureControl anzuzeigen.
Also ein BMP bekomm ich hin, aber da ich ein JPG nicht in dem VS 10 laden kann, kann ich auch keine IDB referenz erstellen um dann da druaf zu zu greifenwie funktioniert das? im inet google ich schon seit 2 std ohne wirklichen erfolg...
also kann mir da wer helfen?
thx LT
-
Ich mach das mit GDI+. Unterstützt auch alle möglichen anderen Formate.
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;
Das hBitmap kannst du dann zum Zeichnen verwenden.
-
welchen datentyp hat denn csFileName ?
weil bei mir will der das ich ein WCHAR angeb... ka was ein WCHAR sein soll
-
Ist vom Typ CString und mit Unicode kompiliert.
WCHAR ist der 2Byte Char Typ.
-
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 PictureControlvielen 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