#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;
}
|