mam v promenne unsigned char ulozenou hodnotu slozek R,G,B,A pixelu.
Jak se s tim da manipulovat. Treba kdybych hodnotu A chtel zmenit z 1 na 0.5 ??
Fórum › C / C++
Operace s bity
ppavel napsal:
mám v proměné unsigned char uloženou hodnotu složek R,G,B,A pixelu.
Jak se s tím dá manipulovat. Třeba kdybych hodnotu A chtěl změnit z 1 na 0.5 ??
Mozna, kdybys sem soupnul aspon naznak toho kolik, ktera polozka zabira bitu, tak by se nam vsem s tim pracovalo mnohem lepe. Navic do bitu neuloyis desetinne cislo. Mno, ale abych porad nekecal kraviny, tak budu trochu dedukovat. Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz..). Cili jednoduchym vypoctem zjistim, ze by pro kazdou polozku mely byt vyhrazeny 2 bity(to nam nedovoluje moc velky rozsah - jenom 2^2, cili mezi jednotlivymi barvami budou velke skoky).A jeste poznamka, bezne se pouzivaji hodnoty z intervalu <0, 255> a mam k dispozici pouze <0, 3>. A ja se toho rozsahu, teda v tomhle pripade nebudu urputne drzet, i kdyz by na prepocet stacila obycejna trojclenka. Takze ted uz vim, ze hodnota 3 je uplne pruhledny objekt, kdezto 0 nepruhledny. Mno, a na zacatku jsem psal, ze nejdou ulozit do bitu desetina cisla.A ted nastava chvile pro trojclenku:
Predpokladam, ze 1 je naprosto pruhledny 0 je nepruhledny.
A ted teda spoctu tu polovicni pruhlednost.
1...3 (vim, ze 1 je pruhledny - tomu odpovida moje 3)
0.5...x (chcu polovicni, ale nevim kolik to je)
---------
x = (0.5/1)*3 = 1.5 ~2
A vyslo mi 1.5, coz jsou priblizne 2.
Tak a ted to hodime do cecka:
#define _8bTo2b(x) (unsigned)ceil(((x)/1)*3)
#define _setAlpha(RGBA, x) { (RGBA) &= ~3; RGBA |= _8bTo2b(x);}
A ted vysvetleni:
(RGBA) &= ~3;
Znamena, ze vymaskuju(obycejny bitovy soucin) hodnotu RGBA hodnotou ~3(negace 3 -> binarne jsou 3: takhle 0000 0011 a po negaci 1111 1100). Mno, tim vynuluju posledni dva bity.
A ted je nastavime pomoci:
RGBA |= _8bTo2b(x);
_8bTo2b(x) provede nasi trojclenku(nepodstatne).
A nastaveni se provadi bitovy souctem. Tzn, pokud bude hodnota na polovine 0.5, tak mi vyjdou 2(binarne 0000 0010).
A nastaveni probiha asi nejak takhle(bitu oznacenym x si nevsimame)
xxxx xx00
OR 0000 0010
---------
xxxx xx10
Mno, doufam ze jsem to nevsvetlil prilis slozite. Ale pokud ano, tak si z toho vem, akorat to podstatne - ty dva makra.
S tim, ze budes pro zcela pruhledny objekt pouzivat 1 a pak uz to zalezi na tobe, jake desetinne cisla zvolis.(I kdyz v podstate mas jenom omezeny rozsah).
Jura_ napsal:
Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz ...
to moc nech?pu, je to norm?ln? 32bitov? tga tedy 8bit na ka?dou slo?ku.
Ka?dop?dn? budu muset k t? odpov?di nastudovat je?t? n?jakou teorii, jeliko? operace s bity m? naprosto unikaj? :) nev?? o n?jakym zdroji na webu?
D
ppavel napsal:
Jura_ napsal:
Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz ...
to moc nech?pu, je to norm?ln? 32bitov? tga tedy 8bit na ka?dou slo?ku.
Ka?dop?dn? budu muset k t? odpov?di nastudovat je?t? n?jakou teorii, jeliko? operace s bity m? naprosto unikaj? :) nev?? o n?jakym zdroji na webu?
D
Mno, mne to bylo hned divne, protoye v tvem prvnim prispevku jsi psal, ze mas v unsigned char(tedy sizeof(unsigned char) = 8 ) ulozene slozky RGBA. Mno, tak ja o zadnem zdroji na webu, kde by zrovna tohle bylo vysvetleno, nevim. Ale postaci ti, kdyz se naucis obycejne bitove operace a jejich syntaxi v C. Klidne se ti to muzu pokusit vysvetli, ale to zalezi na tobe.
Jura_ napsal:
ppavel napsal:
Jura_ napsal:
Mas v podstate 8 bitovou paletu(coz je trochu netradicni pro uchovavani RGBA, ale budiz ...
to moc nechápu, je to normální 32bitové tga tedy 8bit na každou složku.
Každopádně budu muset k té odpovědi nastudovat ještě nějakou teorii, jelikož operace s bity mě naprosto unikají :) nevíš o nějakým zdroji na webu?
D
Mno, mne to bylo hned divne, protoye v tvem prvnim prispevku jsi psal, ze mas v unsigned char(tedy sizeof(unsigned char) = 8 ) ulozene slozky RGBA. Mno, tak ja o zadnem zdroji na webu, kde by zrovna tohle bylo vysvetleno, nevim. Ale postaci ti, kdyz se naucis obycejne bitove operace a jejich syntaxi v C. Klidne se ti to muzu pokusit vysvetli, ale to zalezi na tobe.
voni tam sou uložený za sebou :) Já si to někde najdu, díky.
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žení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 152 hostů
Podobná vlákna
Horní 4 bity - dolní 4 bity — založil RePRO
Příznakové bity — založil yaqwsx
AT89c51 2 stop bity — založil Kamil
Nejvyšší bity v poli — založil Pajda
Moderátoři diskuze