HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > C++ Конвертирование BMP 24 -> 8 bit
Страницы (3): [1] 2 3 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



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

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

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

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

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

Вложение: bmpfileconvert.rar (75.4 кб)
Этот файл был скачан 599 раз.

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

Сообщить модератору | IP: Записан
Сообщение: 68070

Старое сообщение 26-11-2010 18:35
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35003
Нанёс повреждений: 514 ед.
Возраст: 38

Рейтинг



Награды
 
[1 награда]


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

__________________

Сообщить модератору | IP: Записан
Сообщение: 68071

Старое сообщение 26-11-2010 18:40
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



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

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

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

Сообщить модератору | IP: Записан
Сообщение: 68072

Старое сообщение 26-11-2010 18:41
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33014
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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'

Сообщить модератору | IP: Записан
Сообщение: 68073

Старое сообщение 26-11-2010 19:34
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35003
Нанёс повреждений: 514 ед.
Возраст: 38

Рейтинг



Награды
 
[1 награда]


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

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

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

__________________

Сообщить модератору | IP: Записан
Сообщение: 68074

Старое сообщение 26-11-2010 19:41
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



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

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

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

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

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

Сообщить модератору | IP: Записан
Сообщение: 68075

Старое сообщение 26-11-2010 19:55
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33014
Нанёс повреждений: 392 ед.

Рейтинг



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

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

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

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

Вложение: bmpfileconvert.rar (74.1 кб)
Этот файл был скачан 533 раз.
Дядя Миша проверил это вложение на вирусы 26-11-2010 в 20:01

__________________
My Projects: download page

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

Цитата:

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

Сообщить модератору | IP: Записан
Сообщение: 68076

Старое сообщение 26-11-2010 20:01
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



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

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

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

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


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

byte r
byte g
byte b
byte reserve

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

Сообщить модератору | IP: Записан
Сообщение: 68078

Старое сообщение 26-11-2010 20:23
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33014
Нанёс повреждений: 392 ед.

Рейтинг



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

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

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

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

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

byte r
byte g
byte b
byte reserve

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

Вложение: colorquant.zip (2.8 кб)
Этот файл был скачан 489 раз.
Дядя Миша проверил это вложение на вирусы 26-11-2010 в 20:33

__________________
My Projects: download page

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

Цитата:

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

Сообщить модератору | IP: Записан
Сообщение: 68079

Старое сообщение 26-11-2010 20:29
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



Насчет 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
}

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

Сообщить модератору | IP: Записан
Сообщение: 68080

Старое сообщение 26-11-2010 20:40
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33014
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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'

Сообщить модератору | IP: Записан
Сообщение: 68081

Старое сообщение 26-11-2010 20:45
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35003
Нанёс повреждений: 514 ед.
Возраст: 38

Рейтинг



Награды
 
[1 награда]


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

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

__________________

Сообщить модератору | IP: Записан
Сообщение: 68082

Старое сообщение 26-11-2010 20:47
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 34

Рейтинг



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

вместо RGB, BGR

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

Сообщить модератору | IP: Записан
Сообщение: 68083

Старое сообщение 26-11-2010 20:52
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33014
Нанёс повреждений: 392 ед.

Рейтинг



Здрасти. Ну 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'

Сообщить модератору | IP: Записан
Сообщение: 68086

Старое сообщение 26-11-2010 21:04
-
SiPlus
GMod Lua Coder
Девойс

Дата регистрации: Jun 2007
Проживает: Санкт-Петербург
Сообщений: 317
Возраст: 28

Рейтинг



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

Сообщить модератору | IP: Записан
Сообщение: 68111

Старое сообщение 27-11-2010 12:36
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 17:05. Новая тема    Ответить
Страницы (3): [1] 2 3 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > C++ Конвертирование BMP 24 -> 8 bit
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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