Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytywanie danych Binarnych - RGBA 32 bity

Ostatnio zmodyfikowano 2023-01-06 21:36
Autor Wiadomość
bbogdan1995
Temat założony przez niniejszego użytkownika
Wczytywanie danych Binarnych - RGBA 32 bity
» 2023-01-06 18:09:00
Witam!
Pracuje z plikiem graficznym w formacie *.rgba.
Poza tym ze jest to format stworzony specjalnie dla CSS, nie znalazlem niczego przydatnego ani dobrej specyfikacji (albo jestem za slaby). Pomyslalem wiec, ze dobrze, by bylo choc wczytaj dane jako czyste RGBA po kolei (w koncu i tak bede musial czytac piksele). Jest to moje pierwsze starcie z binarka.

Format zabiera struktury 8 bitowe jak mniewam (4x256), bo gdzies wyczytalem o glebi 32 bity. No wiec probowalem w ten sposob wyjac te dane, aby miec czyste integery. Niestety wyrzuca mi same [0,0,0,0]. Pomozecie ?

C/C++
ifstream file;
unsigned int data;
unsigned int r, g, b, a;

file.open( filename );
if( file )
{
   
cout << "file open has been success\n";
   
while( !file.eof() )
   
{
       
file >> data; // ponoc ta metoda wczyta inta (z poradnika)
       
       
r = data >> 24;
       
g =( data << 8 ) >> 24;
       
b =( data << 16 ) >> 24;
       
a =( data << 24 ) >> 24;
       
printf( "[%i,%i,%i,%i]\n", r, g, b, a );
   
};
} else
   
 cout << "file open has been failed\n";

file.close();
P-179838
DejaVu
» 2023-01-06 18:32:21
Ale co chcesz wczytać? jakiś konkretny format pliku czy co? Daj linka do opisu tego 'specjalnego' formatu dla CSS. Przy okazji zamień typ int na typ unsigned int, bo wykonujesz rotacje bitowe.
P-179841
bbogdan1995
Temat założony przez niniejszego użytkownika
» 2023-01-06 18:40:33
Pisze gre na androida. Potrzebuje przetwarzac pliki graficzne, najpierw chcialem, by to byly PNG, ale mozliwosci mojego kompilatora (tworze na smartphonie), dalekie sa od tego, bym to zrobil zarowno jak i moj poziom wiedzy.
Szukalem wiec bezstratnych formatow graficznych ale nawet BMP byl zbyt przerazajacy :D

Udalo mi sie znalezc format ppm ( tylko RGB z biblioteki netpbm), ale on nie obsluguje kanalu alfa. Wiec...
udalo mi sie znalezc Konwerter na *.rgba ze strony
https://convertio.co/pl/

(trzeba wybrac plik, potem konwertuj na obrazy->rgba :D )

Mysle ze to czysty zapis rgba, po 8 bitow, piksel po pikselu.. Probowalem wyjac po kolei wartosci skladowe piksela.

Juz zmienilem na unsigned int dla r,g,b,a.

Link z wiki:
https://en.m.wikipedia.org/wiki/RGBA_color_model

(ps. nie mysleliscie o wprowadzeniu motywow graficznych dla strony a przynajmniej dark theme na standardowym dark grey? cos jak w visual studio - przyjemniej korzystalo, by sie z forum. nawet na reklamach moglibyscie sporo zarobic)
P-179843
DejaVu
» 2023-01-06 20:18:56
Użyj biblioteki SFML. Tam jest dostępna biblioteka do wczytywania obrazków PNG. Jeżeli biblioteka jest dla Ciebie za duża i nie wiesz jak skompilować to weź ściągnij i skompiluj sobie bibliotekę libPng (wymaga również biblioteki libZlib).
P-179845
bbogdan1995
Temat założony przez niniejszego użytkownika
» 2023-01-06 20:30:19
To nie jest odpowiedz na moje pytanie.
Wciaz nie wiem jak wczytac binarnie pilk. Gdybym tylko mogl wczytac te dane, przerzucilbym je do tekstury i juz mialbym wszystko zrobione.
A tak z kolei znow bede musial wrzucic kolejny post jak konwerterowac PNG na teksture.

Prosze jednak, aby w miare mozliwosci mi pomoc. Wystarczy, ze wczytam te inty, wlasnie po to zalozylem ten temat.
P-179846
DejaVu
» 2023-01-06 20:41:55
https://cpp0x.pl/forum/temat/?id=22058

C/C++
ifstream plik( "test.bin", ios::in | ios::binary );
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
while( plik.get( r ) && plik.get( g ) && plik.get( b ) && plik.get( a ) )
{
   
//...
}
P-179847
bbogdan1995
Temat założony przez niniejszego użytkownika
» 2023-01-06 21:05:16
uzylem Twojego kodu hmm.. i wywala mi przy funkcji get(). Wczesniej dolaczylem biblioteki:
C/C++
#include <iostream>
#include <fstream>

Jest jakas alternatywna funkcja do get()?
P-179848
DejaVu
» 2023-01-06 21:07:53
C/C++
ifstream plik( "test.bin", ios::in | ios::binary );
for(;; )
{
   
unsigned char r;
   
unsigned char g;
   
unsigned char b;
   
unsigned char a;
   
plik.read( & r, 1 );
   
plik.read( & g, 1 );
   
plik.read( & b, 1 );
   
plik.read( & a, 1 );
   
   
if( !plik.good() )
       
 break;
   
   
//... tu przetwarzanie odczytanych bajtów
}

Metoda get przyjmuje zmienną typu char, a nie unsigned char: https://cplusplus.com/reference/istream/istream/get/
Metoda read przyjmuje zmienną typu char*: https://cplusplus.com/reference/istream/istream/read/.

Tak więc:
C/C++
plik.read( reinterpret_cast < char * >( & r ), 1 );
P-179849
« 1 » 2
  Strona 1 z 2 Następna strona