JPG anstelle BMP laden
-
Ein Codesegment in meinem Programm lautet:
HBITMAP hBitmap = (HBITMAP) ::LoadImage (NULL, filename, IMAGE_BITMAP, 0, 0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );filename ist z.B. "C:\\Test.bmp"
Jetzt muss man alternativ auch JPG-Format laden können. Wie gehe ich hier am einfachsten vor?
-
Benutze die GDI+, die kann JPEG, PNG, TIF und GIF laden.
-
Die Ziel-Plattform ist Win-XP. Wo erhalte ich das GDI+ SDK passend zu MSVC++6? Welche Funktion kann ich da analog zu obigem Code verwenden? Ich möchte, das es analog in HBITMAP mündet. Ist das alles machbar?
-
o.k. im MS Platform SDK sind die GDIPlus...-Header enthalten.
Welche Funktion von GDI+ kann mir bei meinem konkreten Problem helfen?
-
1. Für einen allgemeinen Einstieg in GDI+ habe ich einen entsprechenden Einsteigerartikel geschrieben, in dem die Einrichtung und Grundlagen (Linien zeichnen usw.) erklärt werden. Findest du hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-128603.html2. Um eine Grafikdatei zu laden, solltest du dir die Beispiele in der GDI+ Doku mal anschauen. Das erste benutzt Gdiplus::Image.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/usingGDIPlus/usingimagesbitmapsandmetafiles.aspSpeziell kannst du dir auch Gdiplus::Bitmap anschauen, die ist leistungsfähiger als Gdiplus::Image.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/GDIPlusreference/classes/bitmap.aspUnd CachedBitmap ist dann das schnellste bzgl. zeichnen, wenn man unbedingt Perfomance benötigt.
-
Die Bitmap-Klasse könnte die richtige sein. Sehe ich das so richtig?
JPEG- oder BMP-File -> Bitmap: (man muss nicht unterscheiden, ob BMP oder JPG, richtig?)
Bitmap(const WCHAR * filename, BOOL useIcm);Bitmap -> HBITMAP:
Status GetHBITMAP(const Color &colorBackground, HBITMAP * hbmReturn);
-
helpless_ schrieb:
Jetzt muss man alternativ auch JPG-Format laden können. Wie gehe ich hier am einfachsten vor?
Also man muss nicht GDI+ bemühen. Es gibt OleLoadPicture(Ex), dass mit allen möglichen vormaten inkl. JPG umgehen kann. Vor allem hat es ein nettes IPicture Interface mit dem man auch vernünftig Zeichen kann.
-
Ja, dem Bitmap-Konstruktor einfach einen Dateinamen übergeben und dann das HBITMAP holen, da du es ja anscheinend benötigst.
using namespace Gdiplus; Bitmap b(L"picture.jpg"); b.GetHBITMAP(Color::White, myHBitmap);OleLoadPicture(Ex) ist natürlich auch eine Möglichkeit, aber ich würde an deiner Stelle auf das modernere und vorallem leistungsfähigere GDI+ umsteigen.
-
@Artchi: vielen Dank für die ausführliche Hilfe! Wirklich nett.

-
Habe also folgendes gemacht:
BOOL CSAPI001App::InitInstance() { // ... //GDI+ GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; // Initialize GDI+. VERIFY(GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) == Ok); CSAPI001Dlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) {} else if (nResponse == IDCANCEL) {} GdiplusShutdown(gdiplusToken); return FALSE; }stdafx.h:
#define ULONG_PTR DWORD; #include <GdiPlus.h> //gdi+ using namespace Gdiplus;Problem beim Kompilieren, das ich nicht verstehe:
C:\PROGRAMME\MICROSOFT PLATFORM SDK\INCLUDE\GdiplusInit.h(32) : error C2143: Syntaxfehler : Fehlendes ')' vor ';'typedef Status (WINAPI *NotificationHookProc)(OUT ULONG_PTR * token); typedef VOID (WINAPI *NotificationUnhookProc)(ULONG_PTR token);"token" ist nicht bekannt. Was ist dieses OUT? Daran könnte es liegen.
-
Ändere
#define ULONG_PTR DWORD;in
#define ULONG_PTR DWORD*
-
läuft

thx to all