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

Načítání BMP - barvičky – C / C++ – Fórum – Programujte.comNačítání BMP - barvičky – C / C++ – Fórum – Programujte.com

 

Zelenáč0
Posthunter
29. 10. 2007   #1
-
0
-

Mám nekomprimovaný dvoubarevný BMP obrázek (příloha):

šířka: 50px

výška: 20px
bitová hloubka: 24

Nejprve načtu výšku, šířku a spočítám velikost (pokud dobře počítám, mělo by vyjít 1000):
uint width, height, size;


fread(&buffer, 1, 18, fr);
fread(&width, 1, 4, fr);
fread(&height, 1, 4, fr);
fread(&buffer, 1, 28, fr);

size = height*width;
Třída Pixel...
class Pixel

{
public:
unsigned char r, g, b;
};
Alokuju místo pro obrázek a načtu pixely (formát BGR)... Na konci každé řádky se nacházejí dva prázdné byty.
data = new Pixel[size];


for(unsigned int y=0; y<height; y++){

for(unsigned int x=0; x<width; x++){
fread(&data[(y*height)+x].b, 1, 1, fr);
fread(&data[(y*height)+x].g, 1, 1, fr);
fread(&data[(y*height)+x].r, 1, 1, fr);
}

fread(&buffer, 1, 2, fr);
}

A nakonec se presvedcim, ze se mi vsechno povedlo..
for(uint k=0; k<size; k++){

cout << (k+1) << ": " << (int)data[k].r << " " << (int)data[k].g << " " << (int)data[k].b << "\t" << endl;
}


A tady je právě ten problém - člověk by čekla sled 0 a 255. Tak to funguje, ale pouze do cca. 400stého pixelu..
349: 255     255     255

350: 255 255 255
351: 255 255 255
352: 255 255 255
353: 255 255 255
354: 255 255 255
355: 255 255 255
356: 255 255 255
357: 255 255 255
358: 255 255 255
359: 255 255 255
360: 0 0 0
361: 255 255 255
362: 255 255 255
363: 255 255 255
364: 255 255 255
365: 255 255 255
366: 255 255 255
367: 255 255 255
368: 255 255 255
369: 255 255 255
370: 255 255 255
371: 255 255 255
372: 255 255 255
373: 255 255 255
374: 255 255 255
375: 255 255 255
376: 255 255 255
377: 255 255 255
378: 255 255 255
379: 255 255 255
380: 0 0 0
381: 0 0 0
382: 0 0 0
383: 0 0 0
384: 0 0 0
385: 0 0 0
386: 0 0 0
387: 0 0 0
388: 0 0 0
389: 0 0 0
390: 0 0 0
391: 0 0 0
392: 0 0 0
393: 0 0 0
394: 0 0 0
395: 0 0 0
396: 0 0 0
397: 0 0 0
398: 0 0 0
399: 0 0 0
400: 0 0 0


Dál už to nemá s bílou nic společného...
429: 0     0     0

430: 0 0 0
431: 101 101 101
432: 238 238 238
433: 255 255 255
434: 16 16 16
435: 117 117 117
436: 186 186 186
437: 0 0 0
438: 0 0 0
439: 0 0 0
440: 0 0 0
441: 0 0 0
442: 0 0 0
443: 0 0 0
444: 0 0 0
445: 0 0 0
446: 255 255 255
447: 68 68 68
448: 16 16 16
449: 238 238 238
450: 186 186 186
451: 117 117 117


Tak, poradí někdo, kde jsem udělal chybu? :smile11:

Nahlásit jako SPAM
IP: 89.176.254.–
Zelenáč0
Posthunter
29. 10. 2007   #2
-
0
-

Nahlásit jako SPAM
IP: 89.176.254.–
tmi0
Věrný člen
29. 10. 2007   #3
-
0
-

no moc detailne jsem to nezkoumal, ale kontroloval jsi jestli kazde cteni probehne uspesne? myslim ze fread vraci kolik bytu precte. totiz, ty hodnoty (kdyz ctes z binarniho souboru kde jsou hodnoty jen ff a 00) ve me evokuji nahodne vznikle hodnoty, tedy predinicializacni smeti. zkus to pole dat pred zacatkem vynulovat, uvidis jestli to je ten problem (pokud jsi to jiz udelal ci v tom problem neni tak skutecne nevim kde by mohl byt problem, tedy jakym zpusobem by se na ta mista mohly dostat tak pro tento pripad zvlastni hodnotu).

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Zelenáč0
Posthunter
29. 10. 2007   #4
-
0
-

Heh, reseni je obcas tak nechutne jednoduche... Jen nechapu, proc to tu nahodnou hodnotu neprepise? Moc to ale neresi muj problem. Otestoval jsem kazdy fread - kazdy neco precte.. Prebyva mi tam tedy 600 cernych pixelu (600/50 = 12) - 12 cernych radku, ktere tam nikde nejsou.

Abych vyloucil moji neznalost formatu BMP - obrazek je veliky 3094 bytu.
Hlavicka ma velikost 54 bytu
Prazdne pixely na konci radku : 40 bytu. (vyska*2 = 20*2 = 40)
Samotna data: 3000 bytu ( (sirka*vyska) * (hloubka/8) = (50*20) * (24/8) = 1000*3 = 3000 )
3000+40+54 = 3094... Tady by tedy problem byt nemel...

Nahlásit jako SPAM
IP: 89.176.254.–
Zelenáč0
Posthunter
29. 10. 2007   #5
-
0
-

:smile5: Uz jsem chybu nasel

fread(&data[(y*height)+x].b, 1, 1, fr);

Ma tam byt width...

Nahlásit jako SPAM
IP: 89.176.254.–
tmi0
Věrný člen
29. 10. 2007   #6
-
0
-

stave se... nejhorsi sou prasarny typu funkce ktera ma naplnit nejakou matici v podobe pristupoveho vektoru... a splest si potom indexaci v ukazateli na ukazatel na ukazatel neni tak tezky... jeste k tomu kdyz u grafu se vertikalni souradnice standardne udava jako druha, u matic jako prvni...

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
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, 31 hostů

Podobná vlákna

Načítání BMP přes C++ — založil Lokutus7323

Load BMP — založil bart

Změna štětce bmp — založil bird

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ý