Bu Blogda Ara

15 Kasım 2009 Pazar

BMP biçimindeki dosyaları okuma / C++ / OOP / openGL

BMP biçimindeki dosyalar, sıkıştırılmadan kullanılan ilkel resim dosyalarıdır. Basit bir kodlama yöntemi olduğundan rahatlıkla okunabilmektedir. Fakat herhangi bir sıkıştırma uygulanmadığı için disk üzerinde çok fazla yer kaplamaktadır. OpenGL ile grafik programlama yapanlar için kolaylık sağlayacağını düşündüğüm bir sınıf yazdım. 24-bit BMP dosyalarını okuyarak piksel bilgilerini hafızaya yükleyebilirsiniz. Önce sınıfa bir göz atalım:


// 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: