JPEG画像を表示する

「JPEG画像を表示する」の編集履歴(バックアップ)一覧に戻る

JPEG画像を表示する - (2011/02/07 (月) 19:54:33) のソース

<p><strong>JPEG画像を読み込んで表示します。<br />
フルカラーとグレースケールのみサポートしています。<br />
かなりデータサイズを小さくできるので広く使われています。<br /></strong><a href="http://www.ijg.org/"><strong>http://www.ijg.org/</strong></a><strong><br />
こちらのサイトでフリーのJPEGライブラリのソースコードが配布されています。<br />
libjpeg.lib を作成してください。作り方はgoogleなどで検索して作って下さい。<br />
jpeglib.h , jconfig.h , jmorecfg.h , libjpeg.lib をプロジェクトのフォルダに設置して下さい。<br />
これでJPEGを読み込む準備が整いました。</strong></p>
<p> <img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=68&amp;file=jpeg.png" /></p>
<table border="1" cellspacing="1" cellpadding="1" width="600"><tbody><tr><td>
<p><span style="font-size:small;">#pragma comment(linker, "/SUBSYSTEM:WINDOWS
/ENTRY:mainCRTStartup")<br />
#pragma comment(lib,"libjpeg.lib")<br />
#include &lt;GL/freeglut/freeglut.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include "jpeglib.h"</span></p>
<p><span style="font-size:small;">#define WIDTH 320<br />
#define HEIGHT 240</span></p>
<p><span style="font-size:small;">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 />
};</span></p>
<p><span style="font-size:small;">JPEG::JPEG(char *FileName){<br />
 cinfo.err = jpeg_std_error( &amp;jerr );<br />
 jpeg_create_decompress( &amp;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( &amp;cinfo, File );<br />
 jpeg_read_header( &amp;cinfo, TRUE );<br />
 sizeX=cinfo.image_width;<br />
 sizeY=cinfo.image_height;<br />
 jpeg_start_decompress( &amp;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 &lt; cinfo.image_height; i++ ) {<br />
  img[i] = (JSAMPROW)calloc( sizeof( JSAMPLE ), 3 * cinfo.image_width );<br />
 }<br />
 // 全イメージデータを取得 <br />
 while( cinfo.output_scanline &lt; cinfo.output_height ) {<br />
  jpeg_read_scanlines( &amp;cinfo,img +
cinfo.output_scanline,cinfo.output_height - cinfo.output_scanline );<br />
 }<br />
 for(int i=0;(unsigned)i&lt;sizeY;i++){<br />
  for(int j=0;(unsigned)j&lt;sizeX*3;j++){<br />
   Data[i*sizeX*3+j] = (char)img[sizeY-i-1][j];<br />
  }<br />
 }<br />
 jpeg_finish_decompress( &amp;cinfo );<br />
 jpeg_destroy_decompress( &amp;cinfo );<br />
 <br />
 fclose( File );<br />
 // イメージデータを保持するメモリ領域を開放<br />
 for ( int i = 0; (unsigned)i &lt; sizeY; i++ )<br />
  free( img[i] );<br />
 free( img );<br />
  return true;<br />
}</span></p>
<p><span style="font-size:small;">void JPEG::TexSet()<br />
{<br />
 glEnable( GL_TEXTURE_2D );<br />
 glGenTextures( 1, &amp;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 />
}</span></p>
<p><span style="font-size:small;">JPEG *jpeg;</span></p>
<p><span style="font-size:small;">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);</span></p>
<p><span style="font-size:small;"> glEnable(GL_TEXTURE_2D);//テクスチャ有効<br />
 glBindTexture( GL_TEXTURE_2D, jpeg-&gt;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);//テクスチャ無効</span></p>
<p><span style="font-size:small;"> 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("test.jpg");</span></p>
<p><span style="font-size:small;">}</span></p>
<p><span style="font-size:small;">int main(int argc, char *argv[])<br />
{<br />
 glutInitWindowPosition(100, 100);<br />
 glutInitWindowSize(WIDTH, HEIGHT);<br />
 glutInit(&amp;argc, argv);<br />
 glutCreateWindow("JPEG画像を読み込んで表示");<br />
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />
 glutDisplayFunc(display);<br />
 glutIdleFunc(idle);<br />
 Init();<br />
 glutMainLoop();<br />
 return 0;<br />
}</span></p>
</td>
</tr></tbody></table><p> </p>