powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять конвертация bmp 24 bit to 8 bit
5 сообщений из 5, страница 1 из 1
Опять конвертация bmp 24 bit to 8 bit
    #33469224
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой код:

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
...
Рейтинг: 0 / 0
Опять конвертация bmp 24 bit to 8 bit
    #33469227
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да - забыл:
TRGB:

struct TRGB
{
BYTE b,g,r;
};

C ув. Tors
...
Рейтинг: 0 / 0
Опять конвертация bmp 24 bit to 8 bit
    #33469265
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сканлинии должны быть выровнены под границе в 32 бита.
То есть если у тебя ширина картинки 38 пикселей, надо сканлинии выравнивать по границе в 40 пикселей.
...
Рейтинг: 0 / 0
Опять конвертация bmp 24 bit to 8 bit
    #33469522
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сканлинии должны быть выровнены под границе в 32 бита.
То есть если у тебя ширина картинки 38 пикселей, надо сканлинии выравнивать по границе в 40 пикселей

Не понял, какая зависимость между 32 битами,
реальной шириной 38 пикселей и 40 пикселями?

C ув. Tors
...
Рейтинг: 0 / 0
Опять конвертация bmp 24 bit to 8 bit
    #33469557
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, игнорируются.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять конвертация bmp 24 bit to 8 bit
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]