JPEG画像を表示する

JPEG画像を読み込んで表示します。
フルカラーとグレースケールのみサポートしています。
かなりデータサイズを小さくできるので広く使われています。

http://www.ijg.org/
こちらのサイトでフリーのJPEGライブラリのソースコードが配布されています。
libjpeg.lib を作成してください。作り方はgoogleなどで検索して作って下さい。
jpeglib.h , jconfig.h , jmorecfg.h , libjpeg.lib をプロジェクトのフォルダに設置して下さい。
これでJPEGを読み込む準備が整いました。

 

ファイル
main.cpp
jpeglib.h (配布先サイトから入手して下さい)
jconfig.h (配布先サイトから入手して下さい)
jmorecfg.h (配布先サイトから入手して下さい)
libjpeg.lib (自分で作成して下さい)

sample.jpg

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib,"libjpeg.lib")
#include <GL/freeglut/freeglut.h>
#include <stdio.h>
#include "jpeglib.h"

#define WIDTH 320
#define HEIGHT 240

class JPEG
{
public:
 JSAMPARRAY img;
 struct jpeg_decompress_struct cinfo;
 struct jpeg_error_mgr jerr;
 unsigned long sizeX;  //横
 unsigned long sizeY; //縦
 char *Data;  //画像データ格納
 bool Load(char *filename);
 GLuint texture;
 void TexSet();
 JPEG(char *FileName);
};

JPEG::JPEG(char *FileName){
 cinfo.err = jpeg_std_error( &jerr );
 jpeg_create_decompress( &cinfo );
 Load(FileName);
 TexSet();
}
bool JPEG::Load(char *FileName) {
 FILE *File;
 if ((File = fopen(FileName, "rb"))==NULL){
  printf("ファイルがありません");
  return false;
 }
 jpeg_stdio_src( &cinfo, File );
 jpeg_read_header( &cinfo, TRUE );
 sizeX=cinfo.image_width;
 sizeY=cinfo.image_height;
 jpeg_start_decompress( &cinfo );
 // イメージを保持するメモリ領域の確保と初期化
 Data = (char *) malloc(sizeY*(sizeX*3));
 img = (JSAMPARRAY)malloc( sizeof( JSAMPROW ) * cinfo.image_height );
 for ( int i = 0; (unsigned)i < cinfo.image_height; i++ ) {
  img[i] = (JSAMPROW)calloc( sizeof( JSAMPLE ), 3 * cinfo.image_width );
 }
 // 全イメージデータを取得 
 while( cinfo.output_scanline < cinfo.output_height ) {
  jpeg_read_scanlines( &cinfo,img + cinfo.output_scanline,cinfo.output_height - cinfo.output_scanline );
 }
 for(int i=0;(unsigned)i<sizeY;i++){
  for(int j=0;(unsigned)j<sizeX*3;j++){
   Data[i*sizeX*3+j] = (char)img[sizeY-i-1][j];
  }
 }
 jpeg_finish_decompress( &cinfo );
 jpeg_destroy_decompress( &cinfo );
 
 fclose( File );
 // イメージデータを保持するメモリ領域を開放
 for ( int i = 0; (unsigned)i < sizeY; i++ )
  free( img[i] );
 free( img );
  return true;
}

void JPEG::TexSet()
{
 glEnable( GL_TEXTURE_2D );
 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, 3, sizeX, sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, Data );
 glBindTexture( GL_TEXTURE_2D, 0 );
}

JPEG *jpeg;

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);

 glEnable(GL_TEXTURE_2D);//テクスチャ有効
 glBindTexture( GL_TEXTURE_2D, jpeg->texture );
    glEnable(GL_ALPHA_TEST);//アルファテスト開始
    glBegin(GL_POLYGON);
 glTexCoord2f(0.0f, 0.0f); glVertex2d(10 , 230);//左下
 glTexCoord2f(0.0f, 1.0f); glVertex2d(10 ,  10);//左上
 glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 ,  10);//右上
 glTexCoord2f(1.0f, 0.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);
 jpeg = new JPEG("sample.jpg");

}

int main(int argc, char *argv[])
{
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("JPEG画像を読み込んで表示");
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

最終更新:2015年01月03日 22:41
添付ファイル