Načítání BMP přes C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načítání BMP přes C++ – C / C++ – Fórum – Programujte.comNačítání BMP přes C++ – C / C++ – Fórum – Programujte.com

 

Lokutus7323
~ Anonymní uživatel
11 příspěvků
14. 2. 2011   #1
-
0
-

Dobrý den,
na internetu čistě ze zvědavosti studuji seriály od OpenGL v C++. Narazil jsem na kus kódu zabývajícím se texturami. Víceméně funguje jak má, akorát se nenačítají BMP obrázky v následujícíc části kódu:

int BMPTextura(int texture, const char *filename)

{

FILE *fin;
int width, height, bpp=0;
int size;
unsigned char *bitmap;
unsigned char bmpHeader[54]={0x42, 0x4d, // magicke cislo souboru BMP
0x00, 0x00, 0x00, 0x00, // velikost souboru
0x00, 0x00, 0x00, 0x00, // rezervovano, vzdy nastaveno na nula
0x36, 0x04, 0x00, 0x00, // data offset=54
0x28, 0x00, 0x00, 0x00, // velikost hlavicky=40
0x00, 0x00, 0x00, 0x00, // sirka obrazku v pixelech=?
0x00, 0x00, 0x00, 0x00, // vyska obrazku v pixelech=?
0x01, 0x00, // pocet bitovych rovin=1
0x08, 0x00, // pocet bitu na pixel=24
0x00, 0x00, 0x00, 0x00, // metoda komprimace=nic
0x00, 0x00, 0x00, 0x00, // velikost bitmapy
0x00, 0x00, 0x00, 0x00, // pocet pixelu na metr v horizontalnim smeru
0x00, 0x00, 0x00, 0x00, // pocet pixelu na metr ve vertikalnim smeru
0x00, 0x00, 0x00, 0x00, // pocet pouzitych barev
0x00, 0x00, 0x00, 0x00, // pocet dulezitych barev
};

if (!filename)return -1;
fin=fopen(filename,"r");
if (!fin) return -1; // otevreni souboru se nezdarilo
if (fread(bmpHeader, 54, 1, fin)!=1) return -1; // nacist hlavicku BMP souboru
memcpy(&width, bmpHeader+18, 4); // sirka obrazku v pixelech
memcpy(&height, bmpHeader+22, 4); // vyska obrazku v pixelech
memcpy(&bpp, bmpHeader+28, 2); // pocet bitu na pixel
if (bpp!=24) return -1;
size=width*height*3;
bitmap=(unsigned char *)malloc(size*sizeof(unsigned char));
if (fread(bitmap, size, sizeof(unsigned char), fin)!=1)return -1; //nacteni rastrovych dat
fclose(fin);
glBindTexture(GL_TEXTURE_2D, texture);
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);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height,// nacteni textury do GPU
0, GL_RGB, GL_UNSIGNED_BYTE, bitmap);
free(bitmap);
return 0;
}


Chyba vzniká na řádku
if (fread(bitmap, size, sizeof(unsigned char), fin)!=1)return -1; //nacteni rastrovych dat


kde funkce fread nevyhodí 1 jak by měla, ale 0. A já stále nemuhu přijít na ti proč a tak Vás prosím o radu. Určitě to bude něco banálního, ale já si s tím bohužel nevím rady.

Děkuji předem Všem, kdo poradí nebo napíšou svůj postřeh.

Nahlásit jako SPAM
IP: 94.112.250.–
crAzY^
~ Moderátor
+10
Grafoman
14. 2. 2011   #2
-
0
-

a proč by měla v případě úspěchu vracet 1. fread vrací počet skutečně načtených bajtů.

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Lokutus7323
~ Anonymní uživatel
11 příspěvků
14. 2. 2011   #3
-
0
-

V cem je tedy problem, ze program nedela to co ma?? To je ten tutorial spatne napsany?

Nahlásit jako SPAM
IP: 94.112.250.–
nervak0
Věrný člen
15. 2. 2011   #4
-
0
-

fread vrací počet načtených položek, tady 0 nebo 1.

Ten kód je hodně špatně napsaný, ale nefunguje hlavně asi proto, že mu cpeš BMP ve špatném formátu.

Edit: do modu pro fopen přidej b

fin=fopen(filename,"rb");

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 106 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý