HLFX.Ru Forum Страницы (3): [1] 2 3 »
Показать все 37 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- C++ Конвертирование BMP 24 -> 8 bit (https://hlfx.ru/forum/showthread.php?threadid=2468)


Отправлено fire64 26-11-2010 в 18:35:

C++ Конвертирование BMP 24 -> 8 bit

Написал код для конвертирования 24 битных BMP в 8 битные.

В чем суть: считываем из пикселей цвета и заполняем ими палитру, а вместо цветов ставим индекс цвета из палитры.

Потом записываем заголовки + палитра + пиксели.

По неизвестной мне причине, вместо нормального 8 битного изображения получается что-то странное.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено XaeroX 26-11-2010 в 18:40:

Где изображение этого "странного"?
Ты ж не думаешь всеръез, что мы будем программу запускать?

__________________

xaerox on Vivino


Отправлено fire64 26-11-2010 в 18:41:

Посмотри в папке Debug

test.bmp - оригинал
new.bmp - конвертированная версия.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Дядя Миша 26-11-2010 в 19:34:

Цитата:
fire64 писал:
считываем из пикселей цвета и заполняем ими палитру, а вместо цветов ставим индекс цвета из палитры.

плакал. Ты всеръез думаешь что палитру можно заполнить тупым копированием цветов из RGB24 ?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 26-11-2010 в 19:41:

fire64
У меня new.bmp не открывается, пишет, что ошибка в файле. Ты что, не мог как следовает изучить bmp-формат?

Добавлено 27-11-2010 в 01:41:

Очень похоже на то, что ты что-то в формате файла начудил.

__________________

xaerox on Vivino


Отправлено fire64 26-11-2010 в 19:55:

Дядя Миша, хм.
А разве цвет в палитре не задается с помощью 4 байт r, g, b, reserve ?

Вроде бы в 24 битном формате цвет пикселя задается также.

Логично, что палитра имеет 255 слотов под цвета.

А в самом изображении RGBRes заменяется на индекс идентичного цвета в палитре.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Дядя Миша 26-11-2010 в 20:01:

fire64 на вот тебе для затравки
Почему картинка смещается - ищи сам. Ненавижу эту фишку бмп.

Добавлено 26-11-2010 в 23:01:

Цитата:
fire64 писал:
Логично, что палитра имеет 255 слотов под цвета.

ну хорошо, твой метод проканает для ч\б картинок и рисунков, нарисованных фпаинте. Но для боле-мене полноцветной картинки - никогда.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено fire64 26-11-2010 в 20:23:

Дядя Миша, если в оригинале, количество цветов больше чем 256, то тогда надо будет менять код GetOrAddPixeltoPallet.

Нужно будет работать с областью значений и подбирать наиболее схожие цвета.

Кстати, почему

C++ Source Code:
for( int i = 0; i < countpixel * 3; i+=3 )


Мы же по логике должны смещаться на 4 байта.
Ведь пиксель в 24 битном формате имеет вида:

byte r
byte g
byte b
byte reserve

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Дядя Миша 26-11-2010 в 20:29:

Цитата:
fire64 писал:
Нужно будет работать с областью значений и подбирать наиболее схожие цвета.

ну и на выходе получится гамно, можешь быть уверен.
Квантизатор цветового пространства - это архи-сложная вещь, сравнимая с кодированием звукового сигнала в мп3 с учетом психо-акустических особенностей человеческого организма. Для завтравки - посмотри квантизатор из хл2 бетки.
Согласись, что он "слегка" сложнее тупого подбора похожего цвета.
И это еще не самый лучший квантизатор.

Добавлено 26-11-2010 в 23:29:

Цитата:
fire64 писал:
Мы же по логике должны смещаться на 4 байта.

ну смещайся, кто тебе запрещает? Только потом не жалуйся, что картинку вьювер не открывает.
Цитата:
fire64 писал:
Ведь пиксель в 24 битном формате имеет вида:

byte r
byte g
byte b
byte reserve

Удивительные открытия - каждый день! Это ктож тебя так обманул?
Покажи пальцем, я его сам забаню за распространение ложных слухов.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено fire64 26-11-2010 в 20:40:

Насчет 4 байт для пикселей, кажется читал в вики.

Мда, все оказывается намного сложней.

Я надеялся, что можно просто в GetOrAddPixeltoPallet заменить

C++ Source Code:
if( Palette[i].rgbRed == pRgbData.r && Palette[i].rgbGreen == pRgbData.g && Palette[i].rgbBlue == pRgbData.b )


на

C++ Source Code:
if( CompareColor( Palette[i], pRgbData, 30 ) )


C++ Source Code:
1
bool CompareColor( RGBQUAD Palette, rgbdata_t pRgbData, int maxvalue )
2
{
3
  if( Palette.rgbRed + maxvalue < pRgbData.r || Palette.rgbRed - maxvalue > pRgbData.r )
4
  {
5
    return false;
6
  }
7
 
8
  if( Palette.rgbGreen + maxvalue < pRgbData.g || Palette.rgbGreen - maxvalue > pRgbData.g )
9
  {
10
    return false;
11
  }
12
 
13
  if( Palette.rgbBlue + maxvalue < pRgbData.b || Palette.rgbBlue - maxvalue > pRgbData.b )
14
  {
15
    return false;
16
  }
17
 
18
  return true;
19
}

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Дядя Миша 26-11-2010 в 20:45:

Цитата:
fire64 писал:
Насчет 4 байт для пикселей, кажется читал в вики.

это для 32-битных картинок.
Цитата:
fire64 писал:
Я надеялся, что можно просто в GetOrAddPixeltoPallet заменить

можно, но
Цитата:
Дядя Миша писал:
на выходе получится гамно, можешь быть уверен.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 26-11-2010 в 20:47:

Цитата:
fire64 писал:
Насчет 4 байт для пикселей, кажется читал в вики.

А в наше время молодежь читала MSDN... =\

__________________

xaerox on Vivino


Отправлено fire64 26-11-2010 в 20:52:

Только что, взял свой аватар и сохранил в 24 битном bmp.
Изображение нормально сконвертировалось, но перепутались цветовые каналы.

вместо RGB, BGR

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено Дядя Миша 26-11-2010 в 21:04:

Здрасти. Ну BMP это и есть BGR.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено SiPlus 27-11-2010 в 12:36:

fire64, в 24-х битном BMP для покраски пикселов надо 3 байта (b,g,r). Никаких реверсов там нет. Да и из количества битов все понятно. Это тебе не 32-битный BMP.


Временная зона GMT. Текущее время 08:59. Страницы (3): [1] 2 3 »
Показать все 37 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024