JPEG画像を表示する

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

JPEG画像を表示する」(2015/01/03 (土) 22:41:28) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<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&amp;act=open&amp;pageid=68&amp;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 &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;stdio.h&gt;<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( &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 /> }</p> <p>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 /> }</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-&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);//テクスチャ無効</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(&amp;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>
<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://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=68&amp;file=jp.png" /></p> <table border="1" cellpadding="1" cellspacing="1" style="width:100px;"><tbody><tr><td>ファイル</td> </tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=68&amp;file=main.cpp"> main.cpp</a></td> </tr><tr><td>jpeglib.h (配布先サイトから入手して下さい)</td> </tr><tr><td>jconfig.h<span style="line-height:20.7999992370605px;"> (配布先サイトから入手して下さい)</span></td> </tr><tr><td>jmorecfg.h<span style="line-height:20.7999992370605px;"> (配布先サイトから入手して下さい)</span></td> </tr><tr><td>libjpeg.lib (自分で作成して下さい)</td> </tr><tr><td> <p><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=68&amp;file=sample.jpg"> sample.jpg</a></p> <p><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=68&amp;file=sample.jpg" /></p> </td> </tr></tbody></table><p>main.cpp</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 &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;stdio.h&gt;<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( &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 /> }</p> <p>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 /> }</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-&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);//テクスチャ無効</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(&amp;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>

表示オプション

横に並べて表示:
変化行の前後のみ表示: