adi1525 Temat założony przez niniejszego użytkownika |
Odczyt palety kolorów w bitmapie, język c. » 2017-12-05 17:29:29 Witam, temat opisywany jest wszędzie i jest pełno artykułów odnośnie tego lecz ciągle nie mogę zrozumieć jednej rzeczy. mam taki program: void read( char * FileName ) { FILE * file = fopen( FileName, "rb" ); unsigned char info[ 150 ]; int i = 0; if( file ) { while( i < 54 ) { fscanf( file, "%c", & info[ i ] ); i++; } printf( "\n\n" ); while( i < 150 ) { fscanf( file, "%c", & info[ i ] ); i++; } printf( "\n" ); fclose( file ); } else perror( "Error" ); printf( "Identify: %c%c\n", info[ 0 ], info[ 1 ] ); printf( "File Size = %d\n", info[ 2 ] + info[ 3 ] * 256 + info[ 4 ] * 65536 ); printf( "Table is in: %d\n", info[ 10 ] + info[ 11 ] * 256 * info[ 12 ] * 65536 + info[ 13 ] ); printf( "The size of this header: %d\n", info[ 14 ] + info[ 15 ] * 256 * info[ 16 ] * 65536 + info[ 17 ] ); printf( "The bitmap width in pixel: %d\n", info[ 18 ] + info[ 19 ] * 256 + info[ 20 ] * 65536 + info[ 21 ] ); printf( "The bitmap height in pixels: %d\n", info[ 22 ] + info[ 23 ] * 256 + info[ 24 ] * 65536 + info[ 25 ] ); printf( "The color depth: %d\n", info[ 28 ] + info[ 29 ] ); printf( "The compression method: %d\n", info[ 30 ] + info[ 31 ] * 256 + info[ 32 ] * 65536 + info[ 32 ] ); printf( "\n**************Color Table**********\n" ); printf( "biClrImportant: %d\n", info[ 50 ] ); printf( "Table of color: %d\n", info[ 46 ] + info[ 47 ] * 256 + info[ 48 ] * 65536 + info[ 49 ] ); printf( "biClrImportant: %d\n", info[ 50 ] ); int a = 54, b; while( a < 100 ) { for( b = 0; b < 4; b++ ) { printf( "%d ", info[ a ] ); a++; } printf( "\n" ); } }
Ogólnie sprawa jest prosta, odczytuje nagłówek i wszystko jest ok. Problem rozpoczyna się przy odczycie palety kolorów,odczytuje B G R + alpha i dostaje coś takiego: 0 0 0 0 0 0 128 0 0 128 0 0 0 128 128 0 128 0 0 0 128 0 128 0 128 128 0 0 192 192 192 0 192 220 192 0 240 202 166 0 0 32 64 0 0 32 96 0 Jak zinterpretować te wyniki ? czym jest pierwsze 4 bajty od adresu 54 ?? Moja bitmapa to czerwona kostka 10x10. |
|
pekfos |
» 2017-12-05 18:57:45 Gdzie ten problem? |
|
adi1525 Temat założony przez niniejszego użytkownika |
» 2017-12-05 19:03:36 Doszedłem do tego, że program działa dla odczytu bitmapy 24 bitami na pixel. wtedy uzyskuje: B G R 0 0 255 255 0 0 0 0 255 0 255 0 0 0 255 255 0 0 0 255 0 0 0 255 255 0 0 0 0 255
A dla całej czerwonej kostki która jest 10 na 10 i ma 8 bitów na pixel dostaję: 0 0 0 0 0 0 128 0 0 128 0 0 0 128 128 0 128 0 0 0 128 0 128 0 128 128 0 0 192 192 192 0 192 220 192 0 240 202 166 0 0 32 64 0 0 32 96 0 0 32 128
Rozumiem, że 1 bajt to 3 kolory RGB lecz wartości są różne a wszystkie pixele powinny być czerwone. Może to źle konwertuje po prostu ? Bitmapa (czerwona kostka) jest tworzona przez Painta z 256-kolorową opcją. |
|
pekfos |
» 2017-12-05 19:43:46 Wiesz co to znaczy paleta kolorów? |
|
adi1525 Temat założony przez niniejszego użytkownika |
» 2017-12-05 19:46:51 Tzn ? jeśli chodzi o temat to rzeczywiście powinno być tabela kolorów. Ale odczyt po kolei B G R pierwszego pixela potem B G R drugiego itp jest poprawny ?. |
|
pekfos |
» 2017-12-05 19:52:53 Chodzi o to, że nie wiesz co to jest paleta/tabela kolorów. Próbujesz to wczytać i nawet nie wiesz co to jest i co zawiera. |
|
adi1525 Temat założony przez niniejszego użytkownika |
» 2017-12-05 19:59:36 Rozumiem o co chodzi, że dla zdjęć 8bpp zaraz po nagłówku DIB powinna być ta paleta z kolorami, tylko że też nie wiem jaki ma format gdzie co jest zapisane. Sugerowałem się tym, że dla adresu 10 dostaję informację gdzie jest tabela pixeli. Dostałem wartość 54 więc od tego momentu próbuje to odczytać. |
|
pekfos |
» 2017-12-05 20:48:46 Masz błędy w kodzie odczytującym te wartości. |
|
« 1 » 2 |