Sabtu, 23 Januari 2016

Tekstur Abu-abu / Grayscale



Selamat Pagi rekan-rekan sekalian, kembali lagi ogut nge-blog nih dan kali ini ogut akan membagikan program untuk membuat tekstur abu-abu atau grayscale tekstur.


Kadang kala dalam satu pemrograman grafik atau game kita diharuskan mengubah tekstur menjadi abu-abu atau grayscale. Pada gambar di bawah ini Anda dapat melihat sebuah tekstur warna warni, diubah menjadi abu-abu.


Untuk membuat tekstur seperti ini caranya sangat sederhana, Anda hanya mengganti nilai R, G dan B dengan nilai rata-rata RGB.

BGR_to_RGB = BmpImage[i];      //nilai R
BmpImage[i] = BmpImage[i + 2]; //nilai G
BmpImage[i + 2] = BGR_to_RGB; //nilai B

//ubah ke Black White (nilai rata-rata RGB)
RGBDiv = char((BmpImage[i] + BmpImage[i + 1] + BmpImage[i + 2]) / 3);

//isi dengan nilai rata-rata
BmpImage[i] = RGBDiv;
BmpImage[i + 1] = RGBDiv;
BmpImage[i + 2] = RGBDiv;

Pada koding di atas Anda dapat melihat untuk menentukan nilai rata-rata RGB tambahkan ketiga nilai lalu dibagi dengan 3 (hasil bagi harus bilangan bulat), lalu isikan nilai RGB dengan nilai rata-rata tersebut.

Cara lain yang dapat Anda lakukan dengan menggunakan formula atau rumus berikut ini.

0.21 R + 0.72 G + 0.07 B

Diprogram contoh ogut menyertakan kedua cara ini, Anda tinggal me-remark nilai yang tidak diperlukan.

Ini adalah fungsi yang ogut gunakan untuk membuat tekstur abu-abu, harap diperhatikan  ukuran file bitmap 24 bit yang akan dijadikan tekstur harus kelipatan pangkat 2 (32, 64, 128, 256, dst....)

unsigned int CreateGSTexture(char *file)
{
FILE *pFile = 0;
BITMAPFILEHEADER BmpFileHeader;
BITMAPINFOHEADER BmpInfoHeader;
unsigned char *BmpImage;
unsigned int IDImage;

unsigned char BGR_to_RGB = 0;

unsigned char RGBDiv = 0;

//pFile = fopen(file, "rb");    
errno_t err;

err = fopen_s(&pFile, file, "rb");

//if(!fp)
if (err != 0)
{
MessageBox(NULL, file, "File Bmp tidak ditemukan, BMP Error 01", MB_OK);
return NULL;
}

fread(&BmpFileHeader, sizeof(BITMAPFILEHEADER), 1, pFile);

if (BmpFileHeader.bfType != 0x4D42)
{
fclose(pFile);
MessageBox(NULL, file, "Format file bukan Bmp, BMP Error 02", MB_OK);
return NULL;
}

fread(&BmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);

if (BmpInfoHeader.biSizeImage == 0)
BmpInfoHeader.biSizeImage = BmpInfoHeader.biWidth * BmpInfoHeader.biHeight * 3;

fseek(pFile, BmpFileHeader.bfOffBits, SEEK_SET);

BmpImage = (unsigned char*)malloc(BmpInfoHeader.biSizeImage);

if (!BmpImage)
{
free(BmpImage);
fclose(pFile);
MessageBox(NULL, file, "Gagal alokasi memory untuk texture, BMP Error 03", MB_OK);
return NULL;
}

fread(BmpImage, 1, BmpInfoHeader.biSizeImage, pFile);

fclose(pFile);

if (BmpImage == 0)
{
MessageBox(NULL, file, "Gagal membaca data Bmp, BMP Error 04", MB_OK);
return NULL;
}

for (int i = 0; i < (int)BmpInfoHeader.biSizeImage; i += 3)
{
BGR_to_RGB = BmpImage[i];
BmpImage[i] = BmpImage[i + 2];
BmpImage[i + 2] = BGR_to_RGB;

//ubah ke Black White
RGBDiv = char((BmpImage[i] + BmpImage[i + 1] + BmpImage[i + 2]) / 3);

//=============================
//0.21 R + 0.72 G + 0.07 B
//coba ganti nilai rata2 RGB di atas dengan rumus di bawah ini
//=============================
//RGBDiv = char((BmpImage[i] * 0.21f) + (BmpImage[i + 1] * 0.72f) + (BmpImage[i + 2] * 0.07f));

BmpImage[i] = RGBDiv;
BmpImage[i + 1] = RGBDiv;
BmpImage[i + 2] = RGBDiv;
}

if (BmpImage == 0)
{
MessageBox(NULL, file, "Gagal membuat RGB texture, BMP Error 05", MB_OK);
return NULL;
}

//generate texture
glGenTextures(1, &IDImage);
glBindTexture(GL_TEXTURE_2D, IDImage);

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, BmpInfoHeader.biWidth, BmpInfoHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, BmpImage);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, BmpInfoHeader.biWidth, BmpInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, BmpImage);

if (BmpImage)
{
free(BmpImage);
BmpImage = 0;
}

return IDImage;
}


Sampai disini dulu artikel kali ini, semoga artikel ini bisa bermanfaat, salam


Heriady
heriady.yoh@gmail.com




Artikel terkait
Objek Tangki Air 3D

Tekstur untuk Objek 3D

Membuat File Bitmap 24 Bit

Tidak ada komentar:

Posting Komentar