画像を表示する(GDI+)

2D画像を読み込んで表示します。
DirectXは、D3DXという便利なライブラリが .bmp、.dds、.dib、.jpg、.png、.tga 形式の
画像を読み込んでくれましたが、OpenGLには何もありません。
.bmp ですら、自前で読み込み関数を作ったりしなければなりません。
glpng とか libjpeg など、その他諸々のライブラリを用いても良いのですが、一つのライブラリで
一つの画像形式とかでは面倒くさいです。配布する .dll などが増えるのも嫌です。
そこで割と身近にあり、Windows XP/Vista/7/8の4世代で手軽に使える GDI+ という物を発見しました。
Windows Imaging Component なるものもあるようですが、Vista以降標準搭載なので今回は
インストールなどせずとも最初からある GDI+ にします。
BMP, GIF, JPEG, PNG, TIFF, EMF 形式のファイルを読み込めるようです。
最近使ってなかったので気づきませんでしたが、 #include <objbase.h> を最初にインクルードしないと
エラーが大量に出る模様です。

*(2014.3.28追記)
ちなみに、このGDI+、DirectX7を使用しているようです。
Visual Studio 2010以降はディレクトリの参照設定を
プロジェクト毎に個別に設定しないといけないようになってしまいました。
面倒くさいですね。(^ω^;)
プロジェクトのプロパティで「C/C++」の「追加のインクルードディレクトリ」に
$(DXSDK_DIR)Include を追加するとビルドが通るようです。

 

ファイル
main.cpp

sample.png

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment (lib, "Gdiplus.lib")
#include <objbase.h>
#include <GL/freeglut/freeglut.h>
#include <stdio.h>
#include <stdlib.h>
#include <gdiplus.h>

using namespace Gdiplus;

#define WIDTH 320
#define HEIGHT 240

GdiplusStartupInput gdiPSI;
ULONG_PTR gdiPT;
GLuint tex;

void LoadImage(wchar_t* filename,GLuint &texture)
{
 glEnable( GL_TEXTURE_2D );
 Bitmap bmp( filename );
 BitmapData data;
 bmp.LockBits( 0, ImageLockModeRead, PixelFormat32bppARGB, &data );
 glGenTextures( 1, &texture );
 glBindTexture( GL_TEXTURE_2D, texture );
 glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
 glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
 glTexImage2D( GL_TEXTURE_2D, 0, 4, data.Width, data.Height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, data.Scan0 );
 glBindTexture( GL_TEXTURE_2D, 0 );
 bmp.UnlockBits( &data );
}

void end()
{
 GdiplusShutdown(gdiPT);
}
void display(void)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0);

 glBindTexture(GL_TEXTURE_2D , tex);
 glEnable(GL_TEXTURE_2D);
    glEnable(GL_ALPHA_TEST);
    glBegin(GL_POLYGON);
 glTexCoord2f(0.0f, 1.0f); glVertex2d(10 , 230);//左下
 glTexCoord2f(0.0f, 0.0f); glVertex2d(10 ,  10);//左上
 glTexCoord2f(1.0f, 0.0f); glVertex2d( 310 ,  10);//右上
 glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 , 230);//右下
    glEnd();
    glDisable(GL_ALPHA_TEST);
    glDisable(GL_TEXTURE_2D);

 glutSwapBuffers();
}
void idle(void)
{
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.0, 0.0, 0.0, 1.0);
 glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
 GdiplusStartup(&gdiPT, &gdiPSI, NULL);
 LoadImage(L"sample.png",tex);
}
int main(int argc, char *argv[])
{
 atexit(end);
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("画像を読み込んで表示");
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

 

 

 

 

 

 

最終更新:2015年01月02日 23:23
添付ファイル