<p><strong>JPEG画像を読み込んで表示します。<br /> フルカラーとグレースケールのみサポートしています。<br /> かなりデータサイズを小さくできるので広く使われています。</strong><br /><a href="http://www.ijg.org/"><strong>http://www.ijg.org/</strong></a><br /><strong>こちらのサイトでフリーのJPEGライブラリのソースコードが配布されています。<br /> libjpeg.lib を作成してください。作り方はgoogleなどで検索して作って下さい。<br /> jpeglib.h , jconfig.h , jmorecfg.h , libjpeg.lib をプロジェクトのフォルダに設置して下さい。<br /> これでJPEGを読み込む準備が整いました。</strong></p> <p> <img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&act=open&pageid=68&file=jpeg.png" /></p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #pragma comment(lib,"libjpeg.lib")<br /> #include <GL/freeglut/freeglut.h><br /> #include <stdio.h><br /> #include "jpeglib.h"</p> <p>#define WIDTH 320<br /> #define HEIGHT 240</p> <p>class JPEG<br /> {<br /> public:<br /> JSAMPARRAY img;<br /> struct jpeg_decompress_struct cinfo;<br /> struct jpeg_error_mgr jerr;<br /> unsigned long sizeX; //横<br /> unsigned long sizeY; //縦<br /> char *Data; //画像データ格納<br /> bool Load(char *filename);<br /> GLuint texture;<br /> void TexSet();<br /> JPEG(char *FileName);<br /> };</p> <p>JPEG::JPEG(char *FileName){<br /> cinfo.err = jpeg_std_error( &jerr );<br /> jpeg_create_decompress( &cinfo );<br /> Load(FileName);<br /> TexSet();<br /> }<br /> bool JPEG::Load(char *FileName) {<br /> FILE *File;<br /> if ((File = fopen(FileName, "rb"))==NULL){<br /> printf("ファイルがありません");<br /> return false;<br /> }<br /> jpeg_stdio_src( &cinfo, File );<br /> jpeg_read_header( &cinfo, TRUE );<br /> sizeX=cinfo.image_width;<br /> sizeY=cinfo.image_height;<br /> jpeg_start_decompress( &cinfo );<br /> // イメージを保持するメモリ領域の確保と初期化<br /> Data = (char *) malloc(sizeY*(sizeX*3));<br /> img = (JSAMPARRAY)malloc( sizeof( JSAMPROW ) * cinfo.image_height );<br /> for ( int i = 0; (unsigned)i < cinfo.image_height; i++ ) {<br /> img[i] = (JSAMPROW)calloc( sizeof( JSAMPLE ), 3 * cinfo.image_width );<br /> }<br /> // 全イメージデータを取得 <br /> while( cinfo.output_scanline < cinfo.output_height ) {<br /> jpeg_read_scanlines( &cinfo,img + cinfo.output_scanline,cinfo.output_height - cinfo.output_scanline );<br /> }<br /> for(int i=0;(unsigned)i<sizeY;i++){<br /> for(int j=0;(unsigned)j<sizeX*3;j++){<br /> Data[i*sizeX*3+j] = (char)img[sizeY-i-1][j];<br /> }<br /> }<br /> jpeg_finish_decompress( &cinfo );<br /> jpeg_destroy_decompress( &cinfo );<br /> <br /> fclose( File );<br /> // イメージデータを保持するメモリ領域を開放<br /> for ( int i = 0; (unsigned)i < sizeY; i++ )<br /> free( img[i] );<br /> free( img );<br /> return true;<br /> }</p> <p>void JPEG::TexSet()<br /> {<br /> glEnable( GL_TEXTURE_2D );<br /> glGenTextures( 1, &texture );<br /> glBindTexture( GL_TEXTURE_2D, texture );<br /> glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );<br /> glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );<br /> glTexImage2D( GL_TEXTURE_2D, 0, 3, sizeX, sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Data );<br /> glBindTexture( GL_TEXTURE_2D, 0 );<br /> }</p> <p>JPEG *jpeg;</p> <p>void display(void)<br /> {<br /> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br /> glMatrixMode(GL_MODELVIEW);<br /> glLoadIdentity();<br /> glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0);</p> <p> glEnable(GL_TEXTURE_2D);//テクスチャ有効<br /> glBindTexture( GL_TEXTURE_2D, jpeg->texture );<br /> glEnable(GL_ALPHA_TEST);//アルファテスト開始<br /> glBegin(GL_POLYGON);<br /> glTexCoord2f(0.0f, 0.0f); glVertex2d(10 , 230);//左下<br /> glTexCoord2f(0.0f, 1.0f); glVertex2d(10 , 10);//左上<br /> glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 , 10);//右上<br /> glTexCoord2f(1.0f, 0.0f); glVertex2d( 310 , 230);//右下<br /> glEnd();<br /> glDisable(GL_ALPHA_TEST);//アルファテスト終了<br /> glDisable(GL_TEXTURE_2D);//テクスチャ無効</p> <p> glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br /> glutPostRedisplay();<br /> }<br /> void Init(){<br /> glClearColor(0.0, 0.0, 0.0, 1.0);<br /> glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);<br /> jpeg = new JPEG("sample.jpg");</p> <p>}</p> <p>int main(int argc, char *argv[])<br /> {<br /> glutInitWindowPosition(100, 100);<br /> glutInitWindowSize(WIDTH, HEIGHT);<br /> glutInit(&argc, argv);<br /> glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br /> glutCreateWindow("JPEG画像を読み込んで表示");<br /> glutDisplayFunc(display);<br /> glutIdleFunc(idle);<br /> Init();<br /> glutMainLoop();<br /> return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>