C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как создать палитру на 256 цветов ?
Aptem
Отправлено: 19.02.2006, 13:25


Мастер участка

Группа: Участник
Сообщений: 349



Здравствуйте. Собственно, САБЖ. Необходимо создать палитру 256 цветов и сохранить ее в файл.

Спасибо за внимание.
Grigoriy
Отправлено: 20.02.2006, 15:50


Мастер участка

Группа: Участник
Сообщений: 381



Сабж ?
Это ещё неизвестно.

Ну вопрос поставлен не совсем точно.
Возникают вопросы.
Вам нужно создавать палитру из цветов типа TrueColor ?
Тогда нужно определиться с зависимостью изменения цвета от номера цвета.
Учтите. Самих палитр из 256 цветов True Color может быть большое множество.
Читайте :
Каждый цвет может принимать количество значений = 256*256*256.
И каждое из этих значений может присутствовать в любой из 256 позиций.

Есть предположение о том, что вам нужно создать палитру, где для каждого приращения интенсивности зеленого цвета интенсивность красного цвета изменяется (корень квадратный(корень квадратный(256))) раз.
А для каждого приращения интенсивности синего цвета — интенсивность зеленого изменяется
(корень квадратный(256)) раз.

При изменении номера цвета чаще всего изменяется красный, реже зеленый и ещё реже синий.

?????

Отредактировано Grigoriy — 20/02/2006, 15:52
Aptem
Отправлено: 20.02.2006, 17:51


Мастер участка

Группа: Участник
Сообщений: 349



Я так понимаю палитра  — это последовательность структур R, G, B и еще какой-то ненужный байт. Так? Но как она должна располагаться в bmp-файле? Имеется ввиду, например само изображение расположено вверх ногами, а как с палитрой.

Надеюсь понятно. Спасибо за помощь.

Отредактировано Aptem — 20/02/2006, 17:51
Grigoriy
Отправлено: 21.02.2006, 21:36


Мастер участка

Группа: Участник
Сообщений: 381



Формат "*.bmp" файла следующий.

1. Сначала идут латинские символы "B" и "M".
2. Четырехбайтное значение размера файла в байтах.
3. Две двубайтные резервные области (равны 0 обе). Т. е. четере байта равны нулю.
4. Четырехбайтное значение смещения к началу растрового изображения.
Далее идет структура, характеризующая методику кодировки растра.
5. Размер (Четырехбайтное значение) этой структуры в байтах (должно быть 0x00000028).
6. Четырехбайтное значение ширины изображения в пикселах.
7. Четырехбайтное значение высоты изображения в пикселах.
8. Двухбайтное значение числа цветовых плоскостей (обычно равно 1).
9. Двухбайтное значение числа бит на пиксел (обычно равно 1 или 4 или 8 или 16 или 24 или 32).
10. Четырехбайтное значение метода сжатия (обычно 0).
11. Четырехбайтное значение размера собственного изображения в байтах.
12. Четырехбайтное значение разрешения по горизонтали в пикселах на метр.
13. Четырехбайтное значение разрешения по вертикали в пикселах на метр.
14. Четырехбайтное значение числа цветов в изображении.
15. Четырехбайтное значение числа важных цветов.

Далее следует палитра, если изображение не 24 или 32 битное.
Я не знаю, следует ли палитра, если изображение 16-битное ?

Палитра "*.bmp" файла представляет собой массив значений цветов, где каждый элемент массива размером в 4 байта, и самый младший байт (нулевой байт) кодирует интенсивность синей составляющей цвета, затем следующий байт кодирует интенсивность зеленой составляющей цвета, и наконец второй байт — интенсивность красной составляющей цвета. Самые старшие быйты каждого элемента ничего не кодируют.
Следует заметить, что цвет пиксела канвы кодируется не так.
Самый младший байт кодирует интенсивность красной составляющей цвета, а не синей. (Если мне не изменяет память).

Далее следуют перечисление номеров элементов палитры, которым соответствуют цвета определенных пикселов в порядке слева направо и снизу вверх.

Таким образом, если присутствует палитра, то пикселы "*.bmp" файла могут быть только таких цветов, которые имеются в палитре цветов.

Я бы задал такой вопрос.
А зачем Вам генерировать палитру ?

Вот пример кода.
Он не самый быстродействующий, но он хорошо показывает, как можно сгенерировать палитру из 256 цветов, чтобы было понятнее.

CODE

void GeneratePalette256(unsigned char palette[][4])
{
unsigned char m=1;
for (int i=3;i<255;i+=50)
{
for (int j=1;j<255;j+=42)
{
for (int k=3;k<255;k+=50)
{
palette[m][2]=k;
palette[m][1]=j;
palette[m][0]=i;
palette[m][3]=0;
m++;
};
};
};
palette[0][0]=0;
palette[0][1]=0;
palette[0][2]=0;
palette[0][3]=0;
palette[254][0]=255;
palette[254][1]=255;
palette[254][2]=255;
palette[254][3]=0;
palette[255][0]=255;
palette[255][1]=255;
palette[255][2]=255;
palette[255][3]=0;
};
Aptem
Отправлено: 03.03.2006, 19:35


Мастер участка

Группа: Участник
Сообщений: 349



Большое спасибо, Grigoriy. Все стало понятно.

Итак, в 256-ти цветном (если так можно выразиться) bmp-файле палитра представлена последовательным набором структуры R, G, B, нулевой байт, но только RGB перевернута в обратном порядке, другими словами B, G, R, нулевой байт.

Вернуться в Вопросы программирования в C++Builder