// Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümü
// Ramazan Bellek 2009
// bmpImage Sınıfı Sürüm 1.0
// dosya: BmpLoader.h - 1.0
// http://rbellek.blogspot.com
#ifndef BmpLoader_h
#define BmpLoader_h
#include <windows.h> // Bitmap dosya formatı için gerekli başlık dosyası
class bmpImage
{
private:
int width; // resimin genişliği
int height; // resimin boyu
RGBTRIPLE *imageData; // her bir pikseli tutan 3'lü (kırmızı,mavi,yeşil)
LPCWSTR filename; // okuma yapılacak dosya adresi
HANDLE hfile; // dosyayı işaret eden başlık
DWORD read; // ne kadar veri okudğumuzu tutan değişken
BITMAPFILEHEADER bfh; // dosya başlığı
BITMAPINFOHEADER bih; // bilgileri tutan bölüm
int imagesize; // resmin boyutu (genişlik*boy)
bool status;
void bmpLoad();
void bmpUnload();
public:
bmpImage(LPCWSTR);
bmpImage();
~bmpImage();
void init();
void setFilename(LPCWSTR);
LPCWSTR getFilename();
RGBTRIPLE *getImageData();
int getWidth();
int getHeight();
int getImageSize();
bool getStatus();
void open();
void close();
};
RGBTRIPLE * BmpLoad(LPCWSTR );
#endif
// --------------------------
// Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümü
// Ramazan Bellek 2009
// bmpImage Sınıfı Sürüm 1.0
// dosya: BmpLoader.cpp - 1.0
// http://rbellek.blogspot.com
#include "BmpLoader.h"
bmpImage::bmpImage()
{
init();
}
bmpImage::bmpImage(LPCWSTR filename)
{
this->filename=filename;
init();
open();
}
void bmpImage::init()
{
status=false;
width=0;
height=0;
imagesize=0;
}
void bmpImage::setFilename(LPCWSTR filename)
{
if (!status)
this->filename=filename;
}
LPCWSTR bmpImage::getFilename()
{
if (filename)
return filename;
}
RGBTRIPLE *bmpImage::getImageData()
{
if (status)
return imageData;
else return NULL;
}
int bmpImage::getWidth()
{
if (status)
return width;
else return 0;
}
int bmpImage::getHeight()
{
if (status)
return height;
else return 0;
}
int bmpImage::getImageSize()
{
if (status)
return imagesize;
else return 0;
}
bool bmpImage::getStatus()
{
return status;
}
void bmpImage::open()
{
if (!status)
{
status=true;
bmpLoad();
}
}
void bmpImage::close()
{
if (status)
{
status=false;
bmpUnload();
}
}
void bmpImage::bmpLoad()
{
if (status)
{
hfile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL); // dosyamızı okumak üzere açıyoruz
ReadFile(hfile,&bfh,sizeof(bfh),&read,NULL); // başlık bilgilerini dosyadan okuyoruz.
ReadFile(hfile,&bih,sizeof(bih),&read,NULL);
width=bih.biWidth;
height=bih.biHeight;
imagesize = width*height; // resim için hafızada yer ayırmamıza yardımcı olmaktadır
imageData = new RGBTRIPLE[imagesize]; // resmin üzerinde değişiklik yapmak (istiyorsak) için yeni bir dizi oluşuturuyoruz
ReadFile(hfile,imageData,imagesize*sizeof(RGBTRIPLE),&read,NULL); // matrisi okuyalım (pixeller)
CloseHandle(hfile);
}
}
void bmpImage::bmpUnload()
{
imageData=NULL;
}
// ----------------------------------------------
openGL ile örnek kullanımı:
// programınıza #include "BmpLoader.h" eklemeyi unutmayınız.
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClear(GL_COLOR_BUFFER_BIT);
bmpImage *resim=new bmpImage(L"c:\\kirpi.bmp");
resim->swap(); // RGB <-> BGR
RGBTRIPLE *imageData=resim->getImageData();
glBindTexture (GL_TEXTURE_2D, 1);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, resim->getWidth(), resim->getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, 1);
glBegin (GL_QUADS);
glTexCoord2f (0.0f,0.0f);
glVertex3f(-0.5f,-0.5f,0.0f);
glTexCoord2f (1.0f, 0.0f);
glVertex3f(0.5f,-0.5f,0.0f);
glTexCoord2f (1.0f, 1.0f);
glVertex3f(0.5f,0.5f,0.0f);
glTexCoord2f (0.0f, 1.0f);
glVertex3f(-0.5f,0.5f,0.0f);
glEnd ();
glDisable (GL_TEXTURE_2D);
resim->close();
Sonuc:
BMP dosya formatı için http://en.wikipedia.org/wiki/BMP_file_format adresine göz atabilirsiniz.
İyi Çalışmalar
Hiç yorum yok:
Yorum Gönder