|
|
|
Опять конвертация bmp 24 bit to 8 bit
|
|||
|---|---|---|---|
|
#18+
Есть такой код: TRGB *ptr; TRGB px; const int w=InBmp->Width; const int h=InBmp->Height; OutBmp=new Graphics::TBitmap(); OutBmp->PixelFormat=pf8bit; OutBmp->Width=w; OutBmp->Height=h; BYTE *mas; mas = new BYTE [w*h]; BYTE tmp; for(int y=0;y<h;y++) { ptr=(TRGB *)InBmp->ScanLine[h-y-1]; for(int x=0;x<w;x++) { px=(TRGB)ptr[x]; tmp=(px.r+px.g+px.b)/3; mas[x+w*y]=tmp; } } typedef struct { TLogPalette lpal; TPaletteEntry dummy[256]; } LogPal; LogPal GrayPal; GrayPal.lpal.palVersion = 0x300; GrayPal.lpal.palNumEntries = 256; //Заполняем палетту серым веществом PALETTEENTRY *pe=GrayPal.lpal.palPalEntry; for(int i=0; i < 256; i++) { pe .peRed=i; pe.peGreen=i; pe.peBlue=i; pe.peFlags=0; } //Прицепляем патетту к битмапу OutBmp->Palette=CreatePalette(&GrayPal.lpal); // Получаем адрес на массив пикселов DIB секции битмапа ::BITMAP bmp = { 0 }; GetObject(OutBmp->Handle,sizeof(::BITMAP),&bmp); //копируем из своего массива байтов в битмап memcpy(bmp.bmBits,mas,w*h); OutImage->Picture->Bitmap->Assign(OutBmp); OutBmp->SaveToFile(OutEdit->Text); delete [] mas; Конвертирует, но выходной битмап покарёженный получается В этом топике исходный битмап вложен в следующем - то, что получается В чём грабли? C ув. Tors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 14:50 |
|
||
|
Опять конвертация bmp 24 bit to 8 bit
|
|||
|---|---|---|---|
|
#18+
Да - забыл: TRGB: struct TRGB { BYTE b,g,r; }; C ув. Tors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 14:51 |
|
||
|
Опять конвертация bmp 24 bit to 8 bit
|
|||
|---|---|---|---|
|
#18+
Сканлинии должны быть выровнены под границе в 32 бита. То есть если у тебя ширина картинки 38 пикселей, надо сканлинии выравнивать по границе в 40 пикселей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 15:28 |
|
||
|
Опять конвертация bmp 24 bit to 8 bit
|
|||
|---|---|---|---|
|
#18+
Сканлинии должны быть выровнены под границе в 32 бита. То есть если у тебя ширина картинки 38 пикселей, надо сканлинии выравнивать по границе в 40 пикселей Не понял, какая зависимость между 32 битами, реальной шириной 38 пикселей и 40 пикселями? C ув. Tors ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 18:39 |
|
||
|
Опять конвертация bmp 24 bit to 8 bit
|
|||
|---|---|---|---|
|
#18+
tors Сканлинии должны быть выровнены под границе в 32 бита. То есть если у тебя ширина картинки 38 пикселей, надо сканлинии выравнивать по границе в 40 пикселей Не понял, какая зависимость между 32 битами, реальной шириной 38 пикселей и 40 пикселями? C ув. Tors 1) 32 бита это 4 байта (байт - 8 бит, 32/8 = 4). 2) Битмап у нас 8-битный 3) Сканлинии должны быть выровнены по границе в 32 бита. 4) Допустим, у нас картинка 38x38, следовательно сканлиния будет занимать 38 пикселей * 1 байт на пиксель = 38 байт 5) 38 на 4 не делится. 36 делится, 40 делится, а вот 38 не делится 6) Следовательно нам нужно дополнить вверх длину сканлинии до ближайшего числа кратного четырем. 36 меньше чем 38, значит не годится. А вот 40 - больше, значит используем его. 7) Байты, которые лежат за пределами ширины указанной в BITMAPINFO, игнорируются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 19:11 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33469224&tid=2032188]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 312ms |

| 0 / 0 |
