Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: bitmap -> raakadatakuvaksi

Sivun loppuun

Axuu [19.03.2006 10:31:31]

#

Elikkä olen tekemässä korttipeliä opengllä ja tarvitsisi laittaa tekstuuriksi kortin kuva.

Kun lataan kortin .dll tiedostosta se on HBITMAP -muotoa. ja tekstuuri tarvitsisi sen ilmeisesti jossakin raakadata muodos?, miten saisin sen muodon muutettua?

KIELI = C++

Metabolix [19.03.2006 13:02:52]

#

Avuksi mainittakoon GetDIBits-funktio. Sillä saa datan, joka helposti muuttuu juuri minne tarvitsee. Suosittelen tarkempien tietojen hankkimiseen kokeilemista ja konsoliohjelmia, joissa voi helposti printtailla näkyville tarvittavia tietoja. Silloin selviää helpoiten, onko datan perässä ehkä Bitmapille tyypilliset tasoitukset rivien pituuksiin ja miten päin kuva ja sen värit ovat.

Jos et jaksa tutustua tuohon, voit aina luoda väliaikaisen DC:n, valita sille haluamasi Bitmapin ja lukea pikselit GetPixel-funktiolla. Kannattaa muistaa myös laittaa alkuperäinen bittikartta takaisin DC:lle ja tuhota DC (ja mahdollisesti se omakin bittikartta).

Axuu [19.03.2006 14:28:17]

#

Oisko mahdollista saada valmis pätkä toho?

joo se HBITMAP tarvitsisi vain muuttaa muotoon GLuint *

Metabolix [19.03.2006 14:49:53]

#

Ei missään tapauksessa. Saat itse opetella noita käyttämään. Ja vielä kun et ilmeisesti siitä OpenGL:stäkään tiedä oikein, millaisessa muodossa sen kuvan pitää olla, niin sitä suuremmalla syyllä. HBITMAP muuttuu kyllä GLuint*:ksi typecastilla, mutta siitä ei varmaankaan ole mitään iloa.

Apua saat luonnollisesti, jos tulee jotakin ylivoimaista vastaan.

Axuu [19.03.2006 19:34:12]

#

joo no oon täs ny aikas monta tuntia tota pähkäilly (eilisen ja tän päivän) enkä oikeen saa sitä millään toimimaan (joo en oo kauheesti opengllää käyttäny, mut taitaa jäädäkin vähähks jos en saa toimiin)

elikkä tuolla saan kirjastosta kuvan, mutta se on hbitmap muotoo.

HMODULE hModule = LoadLibrary("Cards.dll");
HBITMAP kuva = LoadBitmap(hModule,MAKEINTRESOURCE(64));

ja tossahanhan on tuo textuurin lataus,ohjelma vain tilttaa käynnistäessä johtuen tuosta väärästä kuvamuodosta.

glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, kuva);

en oikein löytänyt selkeää esimerkkiäkään tuosta GetDiBits fuction käytöstä

int GetDIBits(
  HDC hdc,           // handle to DC
  HBITMAP hbmp,      // handle to bitmap
  UINT uStartScan,   // first scan line to set
  UINT cScanLines,   // number of scan lines to copy
  LPVOID lpvBits,    // array for bitmap bits
  LPBITMAPINFO lpbi, // bitmap data buffer
  UINT uUsage        // RGB or palette index
);

tuostanoin, että esim. mikä taulukko tohon LPVOID kohdalle pitäisi pistää.

toivottavasti saisin laitettua tuon tekstuurin, jos en saa niin kait täytyy tehdä ilman opengllää tuo.

Metabolix [19.03.2006 20:10:00]

#

No sellainen taulukko, johon haluat sen kuvan tallentaa.

Kuten MSDN:stä helposti selviää, ensin laitat siihen NULL, niin funktio täyttää infostruktuurin tiedot, sitten varaat riittävän palan muistia ja annat sen osoittimen siihen kohti.

Axuu [22.03.2006 15:33:28]

#

Löysin jonkinlaisen pätkän, mutta miksi se sanoo että:

main.cpp: In function `void LoadGLTextures()':

main.cpp:34: warning: converting to non-pointer type `BYTE' from NULL
main.cpp:35: warning: converting to non-pointer type `BYTE' from NULL
main.cpp:36: warning: converting to non-pointer type `BYTE' from NULL
main.cpp:37: warning: converting to non-pointer type `BYTE' from NULL
main.cpp:42: error: `g_hWndRender' undeclared (first use this function)
main.cpp:42: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:59: error: `m_texture' undeclared (first use this function)

make.exe: *** [main.o] Error 1

ja tuossa on se löytämäni koodi

void LoadGLTextures()
{
// load bitmap from resource file
HMODULE hModule = LoadLibrary("Cards.dll");
//LOAD THE BITMAP
HBITMAP bitmap = LoadBitmap(hModule,MAKEINTRESOURCE(64));


// setup 24 bits bitmap structure
// works on 8 bits bitmaps also!

BITMAPINFO info;
BITMAPINFOHEADER header;
header.biSize = sizeof(BITMAPINFOHEADER);
header.biWidth = 256;
header.biHeight = 256;
header.biPlanes = 1;
header.biBitCount = 24;
header.biCompression = BI_RGB;
header.biSizeImage = 0;
header.biClrUsed = 0;
header.biClrImportant = 0;
info.bmiHeader = header;
info.bmiColors->rgbRed = NULL;
info.bmiColors->rgbGreen = NULL;
info.bmiColors->rgbBlue = NULL;
info.bmiColors->rgbReserved = NULL;

// store bitmap data in a vector
const int size = 256*256*3;
unsigned char data[size];
HDC hdc = GetDC(g_hWndRender);
GetDIBits(hdc, bitmap, 0, 256, &data, &info, DIB_RGB_COLORS);
ReleaseDC(g_hWndRender, hdc);

// convert from BGR to RGB
unsigned char buff;
for(int i=0; i<256*256; i++)
{
buff = data[i*3];
if(i>=3)
{
data[i*3] = data[i*3+2];
data[i*3+2] = buff;
}
}

// create one texture
glGenTextures(1, &m_texture[0]);

// select texture
glBindTexture(GL_TEXTURE_2D, m_texture[0]);

// SetTextureParameters

// generate texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);
}

sitten koitin vielä toista mutta se valittaa ajettasessa runtime erroria, mutta käänyy

BITMAPINFO bi;
void * rawbits;

//LoadBitmap
HMODULE hModule = LoadLibrary("Cards.dll");
//LOAD THE BITMAP
HBITMAP hbmMyImage = LoadBitmap(hModule,MAKEINTRESOURCE(64));

//This fills the BITMAPINFO structure for you

bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hdc, hbmMyImage, 0, 0, NULL, &bi, DIB_RGB_COLORS);

//Allocate the needed memory

rawbits = (void *)new char[bi.bmiHeader.biSizeImage];

//This will actually copy the bits to the new buffer

GetDIBits(hdc, hbmMyImage, 0, bi.bmiHeader.biHeight, rawbits, &bi, DIB_RGB_COLORS);

//Now proceed with your gl calls, except replace your glTexImage2d call with this:



//--------------------------------

  // luo yksi tekstuuriobjekti
  glGenTextures(1, &taustaTekstuuri);
  // Sido äsken luotu tekstuuri teksturointiyksikköön
  glBindTexture(GL_TEXTURE_2D, taustaTekstuuri);

  // Lataa data tekstuuriin
  glTexImage2D(GL_TEXTURE_2D, 0, 3, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, rawbits);
  // Suodatus päälle
  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

yksi vaihtoehto olis käyttää glaux tiedoston komentoi, mutta ymmärsin että tuo on vanhentunu...kannattaako sitä käyttää? (AUX_RGBImageRec functiot)

Axuu [22.03.2006 18:00:28]

#

joo sain tiedososta ladattua jo textuurin, niin kait mie pian sen si tohonki saan....

Axuu [22.03.2006 22:35:37]

#

Okei elikkä nyt saan ladattua hyvin tiedostosta, mutta kuvan täytyy olla 256x256 kokonen, muuten pätkii ihan tajuttomasti , kuva kylläkin näkyy. Sitten värisyvyyksienkaa on ongelmia, täytyy olla 24bittinen kuva. Miten saisin niin että kuva saa olla minkäkokonen tahansa ja värisysyys kans mikä vain.

LPTSTR szFileName;
GLuint texid=0;
// Creates Texture From A Bitmap File
szFileName = "testi.bmp";
	HBITMAP hBMP;														// Handle Of The Bitmap
	BITMAP	BMP;														// Bitmap Structure

	glGenTextures(1, &texid);											// Create The Texture
														// Does The Bitmap Exist?
	hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );												// If Not Return False

	GetObject(hBMP, sizeof(BMP), &BMP);									// Get The Object
																		// hBMP:        Handle To Graphics Object
																		// sizeof(BMP): Size Of Buffer For Object Information
																		// &BMP:        Buffer For Object Information

	glPixelStorei(GL_UNPACK_ALIGNMENT, 4);								// Pixel Storage Mode (Word Alignment / 4 Bytes)

	// Typical Texture Generation Using Data From The Bitmap
	glBindTexture(GL_TEXTURE_2D, texid);								// Bind To The Texture ID
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);	// Linear Min Filter
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	// Linear Mag Filter
	glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);

	DeleteObject(hBMP);

Axuu [23.03.2006 08:19:58]

#

jeps löysin sellasenki luokan jo nehen sivuilta...mutta nyt ongelmana on se että se valittaa IID_IPicture että:

NeHe_IPicture.o(.text+0xc2):NeHe_IPicture.cpp: undefined reference to `IID_IPicture'
NeHe_IPicture.o(.text+0xe8):NeHe_IPicture.cpp: undefined reference to `OleLoadPicturePath@24'

selailin nettiä enkä löytänyt sopivaa määritystä

Metabolix [23.03.2006 17:39:02]

#

Hienoa, edistystä :)

OpenGL vaatii (speksin mukaan ainakin) joka tapauksessa kuvan, jonka sivut ovat kakkosen potensseja. Kuvan muokkaaminen sopivaksi onnistuu ehkä helpoiten tuossa sillä, että kuvan lataamisen jälkeen luot kaksi DC:tä, liität toiseen sopivan (256x256) apubitmapin ja toiseen sen lataamasi (SelectObject taitaa olla funktio). Sitten blittaat sen ladatun toiselle BitBlt:llä ja käytät sitä lopussa koodissa.

Tuossakin taas tarkkana, että kaikki tulee tuhottua. Eli lopuksi voi vaikka valita ne alkuperäiset kuvat takaisin DC:lle, jolloin ne tuhoutuvat mukana, ja tuhota itse omansa.

Axuu [23.03.2006 19:20:31]

#

Hmm...mistäs saisin tuon "uuid.lib" kirjaston kun ilmeisesti tarvisin sen ja dev-cpp:ssassa ei näytä olevan sitä valmiina, kopsasin borlannista tuon, mutta devi valitti sen tiedosto muodosta, joten se ei toimi.

Axuu [24.03.2006 12:19:44]

#

joo se oli hieman erinimella ja kyllä pelittä nyt.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta