JPG aus Resource laden und an glTexImage2D() übergeben
-
Hallo ...
Ich suche nach einer Möglichkeit ein oder mehrere .JPG Dateien aus den Resourcen der EXE in ein Textur für OpenGL zu laden. Was ich brauche ist:
-ein Pointer auf die *richtigen* Bilddaten (also das unkomrimierte Bild irgendwo im Speicher)
-X Bildgröße
-Y BildgrößeIch habe schon das ganze Internet abgesucht jedoch kein direkt verwendbares Codebeispiel gefunden. Nur diese 2 Ansätze hier:
http://www.morrowland.com/apron/tuto...peg_loader.zip
-> JPG aus einer Datei in eine Textur laden mit Hilfe einer Library, Problem ist hier nur das man mit dieser Library nur Daten von der Festplatte laden kann und nicht aus einer Resource-> Dann habe ich noch den Code hier, Problem hier ist ich bekomme dadurch auch keinen Pointer der auf die eigentlichen Bilddaten zeigt (die Pixel):
LPPICTURE pPicture=0; long lWidth, lHeight; int iWidth, iHeight; void LoadImage(HWND hwnd) { //-- Jpg laden und Pointer holen HRSRC hJpg = FindResource(NULL,"#133","JPG"); HGLOBAL hGJpg = LoadResource(NULL, hJpg); DWORD JpgSize = SizeofResource(NULL, hJpg); LPVOID ptJpg = LockResource(hGJpg); //-- Speicher resvieren und Jpg übertragen HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, JpgSize); LPVOID ptMem = GlobalLock(hGlobal); memcpy(ptMem, ptJpg, JpgSize); //-- Speicher und Resource freigeben GlobalUnlock(hGlobal); UnlockResource(ptJpg); //-- Stream erstellen und Picture erstellen LPSTREAM JpgStream; HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE,&JpgStream); hr = OleLoadPicture(JpgStream, JpgSize, FALSE, IID_IPicture, (LPVOID*)&pPicture); //-- Stream freigeben JpgStream->Release(); //-- Umrechnen in Pixel pPicture->get_Width(&lWidth); pPicture->get_Height(&lHeight); HDC hDc = CreateIC("DISPLAY", NULL, NULL, NULL); iWidth = (lWidth * GetDeviceCaps(hDc, LOGPIXELSX))/2540; iHeight = (lHeight * GetDeviceCaps(hDc,LOGPIXELSY))/2540; SetWindowPos(hwnd,HWND_NOTOPMOST,0,0,iWidth,600,SWP_NOMOVE); return; }Die glTexImage2D() -Funktion (gekürzt aus MSDN):
The glTexImage2D function specifies a two-dimensional texture image.
void glTexImage2D(
GLenum target,
GLint level,
GLint components,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels
);Parameters:
target
The target texture. Must be GL_TEXTURE_2D.level
The level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.components
The number of color components in the texture. Must be 1, 2, 3, or 4.width
The width of the texture image. Must be 2^n + 2(border) for some integer n.height
The height of the texture image. Must be 2^m + 2(border) for some integer m.border
The width of the border. Must be either 0 or 1.format
The format of the pixel data. It can assume one of nine symbolic values:
GL_RGB / GL_BGR_EXTtype
The data type of the pixel data. The following symbolic values are accepted: GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, and GL_FLOAT.pixels
A pointer to the image data in memory.
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
such mal bei google unter dem begriff image loading library und OpenGL. Das Problem hatben schon mehr als nur einer Implementiert. Allerdings würde ich, wenn es nicht unbedngt jpg sein muss eher zu TGA oder PNG tendieren, die Formate sind für Grafikdarstellung einfach besser zu gebrauchen, und wenn sie einmal im Speicher geladen sind nehmen sowiso alle den gleichen Speicher weg (ausser alpha Bilder die brauchen mehr). JPG komprimiert nur auf der Festplatte.
-
such mal bei google unter dem begriff image loading library und OpenGL. Das Problem hatben schon mehr als nur einer Implementiert.
1. gegoogelt habe ich bereits wie ein Irrer
2. Nein, genau DAS hat noch keiner ImplementiertEs gibt viele verschiedene librarys die eine .JPG-Dateien als Textur laden jedoch keine davon unterstützt das laden aus Resourcen(!) ... wenn du mir auch nur eine fertige library zeigst die .JPGs aus einer Resource lädt und mir als Textur für OpenGL zur Verfügung stellt überweis ich dir 5€ aufs Girokonto!
Die ganzen librarys benutzten immer Funktionen wie z.B. SOIL_load_OGL_texture() - mal als Beispiel. (http://www.lonesock.net/soil.html) Man müsste den halben sourcecode auseinander nemhen um da eine Resource zu laden anstatt einer Datei
dann basieren die Lade-Funktionen noch auf der 'FILE'-Struktur die im ganzen library sourcecode warscheinlich zum Lesen und Schreiben verwendet wird... also ganz so einfach mal eben googeln ist hier nicht.unsigned int SOIL_load_OGL_texture ( const char *filename, int force_channels, unsigned int reuse_texture_ID, unsigned int flags ) { /* variables */ unsigned char* img; int width, height, channels; unsigned int tex_id; /* does the user want direct uploading of the image as a DDS file? */ if( flags & SOIL_FLAG_DDS_LOAD_DIRECT ) { /* 1st try direct loading of the image as a DDS file note: direct uploading will only load what is in the DDS file, no MIPmaps will be generated, the image will not be flipped, etc. */ tex_id = SOIL_direct_load_DDS( filename, reuse_texture_ID, flags, 0 ); if( tex_id ) { /* hey, it worked!! */ return tex_id; } } /* try to load the image */ img = SOIL_load_image( filename, &width, &height, &channels, force_channels ); if( NULL == img ) { /* image loading failed */ result_string_pointer = stbi_failure_reason(); return 0; } /* OK, make it a texture! */ tex_id = SOIL_internal_create_OGL_texture( img, width, height, channels, reuse_texture_ID, flags, GL_TEXTURE_2D, GL_TEXTURE_2D, GL_MAX_TEXTURE_SIZE ); /* and nuke the image data */ SOIL_free_image_data( img ); /* and return the handle, such as it is */ return tex_id; } // ... dann kann man das weiterverfolgen unsigned int SOIL_direct_load_DDS( const char *filename, unsigned int reuse_texture_ID, int flags, int loading_as_cubemap ) { FILE *f; unsigned char *buffer; size_t buffer_length, bytes_read; unsigned int tex_ID = 0; /* error checks */ if( NULL == filename ) { result_string_pointer = "NULL filename"; return 0; } f = fopen( filename, "rb" ); if( NULL == f ) { /* the file doesn't seem to exist (or be open-able) */ result_string_pointer = "Can not find DDS file"; return 0; } fseek( f, 0, SEEK_END ); buffer_length = ftell( f ); fseek( f, 0, SEEK_SET ); buffer = (unsigned char *) malloc( buffer_length ); if( NULL == buffer ) { result_string_pointer = "malloc failed"; fclose( f ); return 0; } bytes_read = fread( (void*)buffer, 1, buffer_length, f ); fclose( f ); if( bytes_read < buffer_length ) { /* huh? */ buffer_length = bytes_read; } /* now try to do the loading */ tex_ID = SOIL_direct_load_DDS_from_memory( (const unsigned char *const)buffer, buffer_length, reuse_texture_ID, flags, loading_as_cubemap ); SOIL_free_image_data( buffer ); return tex_ID; }
-
sorry für die unüberlegte Antwort, aber mir war nicht ganz klar, wie du das mit den resources meinst, und das ist es auch immer noch nicht.
-
Was ist denn dein Problem? Finde doch einfach heraus, wie du die Daten in für dich zugreifbaren Speicher laden kannst (zum Beispiel im WinAPI-Forum).
Und hör damit auf, OpenGL damit in Verbindung zu bringen, das ist doch noch nicht dein Problem (und verwirrt nur).
-
-.- ... siehe erster Beitrag...
"Dann habe ich noch den Code hier, Problem hier ist ich bekomme dadurch auch keinen Pointer der auf die eigentlichen Bilddaten zeigt (die Pixel):"ist das da oben kein WinAPI-code?
-
http://openil.sourceforge.net/features.php vll nützt dir das etwas
-
Aus der MSDN:
Parameters Edit 2: Die LockResource() Funktion ist gemeint. hResData [in] Handle to the resource to be locked. The LoadResource function returns this handle. Note that this parameter is listed as an HGLOBAL variable only for backward compatibility. Do not pass any value as a parameter other than a successful return value from the LoadResource function. Return Value If the loaded resource is locked, the return value is a pointer to the first byte of the resource; otherwise, it is NULL.Das heisst Du müsstest einen Zeiger auf das erste Byte des JPEGs kommen. Von da an kannst Du es mit einer normalen JPEG-Laderoutine laden und kannst natürlich auch den Zeiger auf die Pixel setzen. Gibt auch opensource libs um JPEG zu laden. Die sind meist flexibel genug, so dass Du auch aus dem RAM ein Bild laden kannst oder sogar streamen.
Und wenn das Bild mal in deinen Speicher geladen ist, kannst Du es sicher leicht für OpenGL aufbereiten. Empfehle auf jedenfall innerhalb der Engine oder was auch immer du machst eine eigene Struktur/Klasse für Bilder bereit zu stellen. So ist es egal ob Du dann mit irgendeiner png-lib oder einem tga-loader die Bilder lädst und in diesem Format speicherst. Den Code um das ganze von deinem Format zu OpenGL zu kriegen ist dann immer derselbe. Edit: Ich meine kein eigenes Dateiformat, sondern nur die Darstellung innerhalb des Programms.
Jetzt seh ich grad in dem letzten Code den Du gepostet hast die Funktion SOIL_direct_load_DDS_from_memory(). Diese sollte eigentlich reichen, da kannst du mal versuchen den Zeiger den Du von LockResource() bekommst als buffer zu übergeben. Die länge/grösse des Buffers hast Du ja schon durch SizeofResource(). Was die anderen Parameter bedeuten, wird sicher irgendwo in dieser Bibliothek stehen.
Gruss, Andi
-
http://members.iinet.net.au/~cleathley/openGL/TextureLoader.htm
TextureLoader schrieb:
Load from Disk, Internet Stream, Ram (useful if you store images in other file formats (ie. IStorage/IStream containers) and from Resources (VC6).
Soll ich dir jetzt noch meine Kontonummer dazu geben
