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

Wczytywanie danych Binarnych - RGBA 32 bity

Ostatnio zmodyfikowano 2023-01-06 21:34
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
» 2023-01-06 21:19:44
W obu przypadkach jednak powinien byc char (bez unsigned).
Algorytm dziala, dziekuje za pomoc!

Gdyby nie Ty, DejaVu - to nie wiem, co bym zrobi.
Dzieki za pomoc, pozdrawiam :-)

Dobry kod ponizej:
C/C++
char r, g, b, a;

ifstream plik( filename, ios::in | ios::binary );
for(;; )
{
   
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
   
   
printf( "[ %i,%i,%i,%i ]\n", r, g, b, a );
}
plik.close();
P-179850
DejaVu
» 2023-01-06 21:34:48
Taka ciekawostka - mogłeś użyć GPT chat do rozwiązania Twojego problemu:

Mam plik binary w którym zapisałem kolory w formacie RGBA. Jak wczytać ten plik w C++?
Możesz użyć funkcji fread z pliku nagłówkowego stdio.h do odczytania danych z pliku binarnego do tablicy w pamięci. Przykład:

Copy code
C/C++
#include <iostream>
#include <cstdio>

using namespace std;

const int N = 100;

struct Color {
   
unsigned char r, g, b, a;
};

int main() {
   
Color colors[ N ];
   
   
// Otwórz plik binarny do odczytu
   
FILE * fp = fopen( "colors.bin", "rb" );
   
if( !fp ) {
       
cerr << "Błąd podczas otwierania pliku!" << endl;
       
return 1;
   
}
   
   
// Odczytaj dane z pliku do tablicy colors
   
size_t read = fread( colors, sizeof( Color ), N, fp );
   
if( read < N ) {
       
cerr << "Błąd podczas odczytu danych z pliku!" << endl;
       
return 1;
   
}
   
   
// Zamykamy plik
   
fclose( fp );
   
   
// Wczytane dane są teraz dostępne w tablicy colors
   
for( int i = 0; i < N; i++ ) {
       
cout << "Kolor " << i << ": " <<( int ) colors[ i ].r << ", " <<( int ) colors[ i ].g << ", " <<( int ) colors[ i ].b << ", " <<( int ) colors[ i ].a << endl;
   
}
   
   
return 0;
}
Funkcja fread przyjmuje trzy argumenty: wskaźnik do bufora, rozmiar pojedynczego elementu i liczbę elementów do odczytania. W powyższym przykładzie odczytujemy N elementów o rozmiarze sizeof(Color) bajtów do tablicy colors. Jeśli odczyt się powiedzie, fread zwróci liczbę odczytanych elementów.

Uwaga: nie należy używać funkcji fread z pliku nagłówkowego fstream ponieważ ta implementacja jest znacznie wolniejsza niż ta z pliku nagłówkowego stdio.h.




DejaVu DejaVu
Nie chcę definiować rozmiaru tablicy. Kod ma automatycznie wykryć koniec pliku.

Możesz użyć funkcji ftell z pliku nagłówkowego stdio.h do uzyskania aktualnej pozycji w pliku oraz funkcji fseek do ustawienia pozycji w pliku na koniec. Następnie możesz użyć ftell ponownie, aby uzyskać rozmiar pliku w bajtach, a następnie zaalokować odpowiednią ilość pamięci i odczytać dane z pliku. Przykład:

Copy code
C/C++
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

struct Color {
   
unsigned char r, g, b, a;
};

int main() {
   
// Otwórz plik binarny do odczytu
   
FILE * fp = fopen( "colors.bin", "rb" );
   
if( !fp ) {
       
cerr << "Błąd podczas otwierania pliku!" << endl;
       
return 1;
   
}
   
   
// Przesuń wskaźnik pliku na koniec
   
fseek( fp, 0, SEEK_END );
   
   
// Uzyskaj rozmiar pliku w bajtach
   
size_t file_size = ftell( fp );
   
   
// Przesuń wskaźnik pliku z powrotem na początek
   
rewind( fp );
   
   
// Zarezerwuj odpowiednią ilość pamięci dla danych
   
Color * colors =( Color * ) malloc( file_size );
   
if( !colors ) {
       
cerr << "Błąd podczas alokacji pamięci!" << endl;
       
return 1;
   
}
   
   
// Odczytaj dane z pliku do tablicy colors
   
size_t read = fread( colors, sizeof( Color ), file_size / sizeof( Color ), fp );
   
if( read < file_size / sizeof( Color ) ) {
       
cerr << "Błąd podczas odczytu danych z pliku!" << endl;
       
return 1;
   
}
   
   
// Zamykamy plik
   
fclose( fp );
   
   
// Wczytane dane są teraz dostępne w tablicy colors
   
size_t count = file_size / sizeof( Color );
   
for( int i = 0; i < count; i++ ) {
       
cout << "Kolor " << i << ": " <<( int ) colors[ i ].r << ", " <<( int ) colors[ i ].g << ", " <<( int ) colors[ i ].b << ", " <<( int ) colors[ i ].a << endl;
   
}
   
   
// Zwolnij pamięć
   
free( colors );
   
   
return 0;
}



DejaVu DejaVu
Celem jest wczytanie pliku binarnego gdzie kolory są zapisane w formacie RGBA. Rozmiar pliku jest nieznany. Zaimplementuj rozwiązanie. Nie pisz dodatkowych opowieści.

Oto implementacja wczytywania pliku binarnego z kolorami zapisanymi w formacie RGBA:

Copy code
C/C++
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>

using namespace std;

struct Color {
   
unsigned char r, g, b, a;
};

int main() {
   
// Otwórz plik binarny do odczytu
   
FILE * fp = fopen( "colors.bin", "rb" );
   
if( !fp ) {
       
cerr << "Błąd podczas otwierania pliku!" << endl;
       
return 1;
   
}
   
   
// Przesuń wskaźnik pliku na koniec
   
fseek( fp, 0, SEEK_END );
   
   
// Uzyskaj rozmiar pliku w bajtach
   
size_t file_size = ftell( fp );
   
   
// Przesuń wskaźnik pliku z powrotem na początek
   
rewind( fp );
   
   
// Wczytaj dane do wektora
   
vector < Color > colors;
   
while( !feof( fp ) ) {
       
Color color;
       
if( fread( & color, sizeof( Color ), 1, fp ) != 1 ) {
           
break;
       
}
       
colors.push_back( color );
   
}
   
   
// Zamykamy plik
   
fclose( fp );
   
   
// Wczytane dane są teraz dostępne w wektorze colors
   
for( size_t i = 0; i < colors.size(); i++ ) {
       
cout << "Kolor " << i << ": " <<( int ) colors[ i ].r << ", " <<( int ) colors[ i ].g << ", " <<( int ) colors[ i ].b << ", " <<( int ) colors[ i ].a << endl;
   
}
   
   
return 0;
}
W powyższym kodzie używamy funkcji fread do odczytywania pojedynczych elementów z pliku do zmiennej color. Następnie dodajemy ten kolor do wektora colors. Pętla jest kontynuowana dopóki nie nastąpi koniec pliku lub odczyt nie zakończy się niepowodzeniem.
P-179851
1 « 2 »
Poprzednia strona Strona 2 z 2