Infos image pour opengl

Description

Ce programme donne toutes les informations nécessaires concernant une image afin de pouvoir la charger avec OpenGL au travers de fonctions comme glDrawPixels(), glTexImage2D(), ect...
Les informations données sont : L’extension, la largeur, la hauteur, le format des données, le type des données, la taille des données.

J'ai réalisé ce code en C++, avec l'API Win32, et la bibliothèque DevIl.

Je l'ai fait pour moi à la base afin de me simplifier le travail et de rendre le code plus performant en n'ayant pas besoin d'utiliser DevIl pour toutes ces infos mais seulement pour les données de l'image.

Je donne un exemple de code ci dessous :

Source / Exemple :


#include "Window.h"
#include "logs.h"
#include "Ressources.h"

#include <sstream>

namespace img{

cWindow* cWindow::mStaticWindow = NULL;

cWindow::cWindow()
{
	mHinstance = NULL;
	mHwnd = NULL;
	mHdc = NULL;
	mHmenu1 = NULL;
	mHmenu11 = NULL;
	mHmenu22 = NULL;
	mTitle = "";
	mClassName = "WndClass";
        mWndStyle = WS_SYSMENU | WS_VISIBLE;

	mPosx = 0;
	mPosy = 0;
	mWidth = 0;
	mHeight = 0;
    
	mFileName = "";
	mStaticWindow = this;
}

cWindow::~cWindow()
{

}

bool cWindow::CreateWndClass()
{

	WNDCLASSEX wndClass = {0};

    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = StaticWndProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hInstance = mHinstance;
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION /*MAKEINTRESOURCE(IDI_GAME_ENGINE_2D)*/);
    wndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 12);
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = mClassName.c_str();
  
  if(!RegisterClassEx(&wndClass))
  {
	  log::ErrorMessage("Failed create window class!");
	  return false;
  }

  return true;
}

bool cWindow::CreateNewMenu()
{
	mHmenu22 = CreateMenu();
	if(!mHmenu22){
		log::ErrorMessage("Error mHmenu22");
		return false;}
	AppendMenu(mHmenu22, MF_STRING, IDM_ABOUT, "A propos de Infos Images");
   
	mHmenu11 = CreateMenu();
	if(!mHmenu11){
		log::ErrorMessage("Error mHmenu11");
		return false;}
        AppendMenu(mHmenu11, MF_STRING, IDM_OPEN, "Ouvrir...");
	AppendMenu(mHmenu11, MF_SEPARATOR, 0, NULL);
	AppendMenu(mHmenu11, MF_STRING, IDM_QUIT, "Quitter");

	mHmenu1 = CreateMenu();
	if(!mHmenu1){
		log::ErrorMessage("Error mHmenu1");
		return false;}
	AppendMenu(mHmenu1, MF_POPUP, (UINT)mHmenu11, "Fichier");
	AppendMenu(mHmenu1, MF_POPUP, (UINT)mHmenu22, "?");
	return true;
}

bool cWindow::CreateNewWindow(HINSTANCE hinstance, std::string title, int posx, int posy, int width, int height)
{
    mHinstance = hinstance;

	mPosx = posx;
	mPosy = posy;
	mWidth = width;
	mHeight = height;
	mTitle = title;

   if(!this->CreateWndClass())
		return false;

   if(!this->CreateNewMenu())
	   return false;

	mHwnd = CreateWindowEx(NULL, mClassName.c_str(), mTitle.c_str(), mWndStyle,mPosx, mPosy, 
			                  mWidth, mHeight, HWND_DESKTOP, mHmenu1, mHinstance, NULL);

    if(!mHwnd)
	{
		log::ErrorMessage("Failed to create window!");
		return false;
	}

    ShowWindow(mHwnd, SW_SHOW); 
    UpdateWindow(mHwnd);

	this->DisplayInformations();
	this->MainLoop();

	return true; 
}

void cWindow::MainLoop()
{

	while(GetMessage(&mMsg, NULL, 0, 0))
    {
        TranslateMessage(&mMsg);
        DispatchMessage(&mMsg);
	}

    ReleaseDC(mHwnd, mHdc);
}

void cWindow::DisplayInformations()
{
	PAINTSTRUCT ps;
	mHdc = BeginPaint(mHwnd, &ps);

	HFONT hfont;
	LOGFONT logfont;

	ZeroMemory(&logfont, sizeof(LOGFONT));
	lstrcpy(logfont.lfFaceName, "Courier New");
	logfont.lfHeight = 15;
	hfont = CreateFontIndirect(&logfont);
        SelectObject(mHdc, hfont);

        SetBkMode(mHdc, TRANSPARENT);
    
	TextOut(mHdc, 10, 10, GetName().c_str(), GetName().size()); 
	TextOut(mHdc, 10, 40, "Extension", 9);
	TextOut(mHdc, 150, 40, GetFileType().c_str(), GetFileType().size());
	TextOut(mHdc, 10, 60, "Largeure", 8);
	TextOut(mHdc, 150, 60, cImageInfos::GetWidth().c_str(), cImageInfos::GetWidth().size());
	TextOut(mHdc, 10, 80, "Hauteur", 7);
	TextOut(mHdc, 150, 80, cImageInfos::GetHeight().c_str(), cImageInfos::GetHeight().size());
	TextOut(mHdc, 10, 100, "Format Des Données", 18);
	TextOut(mHdc, 150, 100, GetDataFormat().c_str(), GetDataFormat().size());
	TextOut(mHdc, 10, 120, "Type Des Données", 16);
	TextOut(mHdc, 150, 120, GetDataType().c_str(), GetDataType().size());
	TextOut(mHdc, 10, 140, "Taille Des Données", 18);
	TextOut(mHdc, 150, 140, GetDataSize().c_str(), GetDataSize().size());    
	DeleteObject(hfont);
	EndPaint(mHwnd, &ps);
	ReleaseDC(mHwnd, mHdc);
	
 
}

LRESULT CALLBACK cWindow::StaticWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	return mStaticWindow->WndProc(hwnd, msg, wParam, lParam);
}

LRESULT CALLBACK cWindow::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
	    case WM_CREATE:
			break;

		case WM_PAINT:
			this->DisplayInformations();
			break;

	    case WM_KEYDOWN:
			switch(wParam)
		    {
		        case VK_ESCAPE:
		        PostQuitMessage(0);
				break;
		    }
		    break;

		case WM_COMMAND:
			if(LOWORD(wParam) == IDM_QUIT)
				PostMessage(mHwnd, WM_DESTROY, 0, 0);

            if(LOWORD(wParam) == IDM_OPEN)
			{
				mFileName = this->DialogBoxOpenFileName();
				if(mFileName != "none")
				{
				    LoadNewImage(mFileName);
				    InvalidateRect(mHwnd, NULL, true);
				}
			}

 			if(LOWORD(wParam) == IDM_ABOUT)
				DialogBox(mHinstance, "DIALOGBOXABOUT", mHwnd, (DLGPROC)DialogBoxAboutProc);

			break;

	    case WM_CLOSE:
	    case WM_QUIT:
	    case WM_DESTROY:
			PostQuitMessage(0); 
		    break;

	
	      default:
	      return DefWindowProc(hwnd, msg, wParam, lParam);
	}

	return 0;
}

bool APIENTRY cWindow::DialogBoxAboutProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
	    case WM_INITDIALOG:
		    return true;

	    case WM_COMMAND:
			if(LOWORD(wParam) == IDOK)
			{
				EndDialog(hwnd, 0);
			    return true;
			}

		default:
			return false;
		
	}
	return false;

}

std::string cWindow::DialogBoxOpenFileName()
{
	OPENFILENAME ofn = {0};
	CHAR file[MAX_PATH] = {0};

	ofn.lStructSize = sizeof(OPENFILENAME);
	ofn.hwndOwner = mHwnd;
	ofn.lpstrFile = file;
	ofn.nMaxFile = MAX_PATH;
	ofn.nFilterIndex = 1;
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

	if(GetOpenFileName(&ofn))
		return file;
    
	std::string none = "none";
	return none;
}

} // namespace img

Conclusion :


Donnez moi votre avis.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.