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

Odczyt palety kolorów w bitmapie, język c.

Ostatnio zmodyfikowano 2017-12-05 21:23
Autor Wiadomość
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:

C/C++
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.
P-167578
pekfos
» 2017-12-05 18:57:45
Gdzie ten problem?
P-167583
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ą.
P-167586
pekfos
» 2017-12-05 19:43:46
Wiesz co to znaczy paleta kolorów?
P-167588
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 ?.
P-167589
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.
P-167592
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ć.
P-167593
pekfos
» 2017-12-05 20:48:46
Masz błędy w kodzie odczytującym te wartości.
P-167604
« 1 » 2
  Strona 1 z 2 Następna strona