| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > TColor - ? |
| Автор: AVA 9.6.2004, 15:20 |
| TColor -> 32бита -> 4байта. 3-и из них это RGB цвета, а для чего 4-й? И ещё вопрос, предположим у меня палитра 256 цветов, то каким образом пределенный цвет из этой палитры впишется в эти 32 бита |
| Автор: Kesh 10.6.2004, 00:20 |
| Ну, например, для задания alpha-канала... Т.е. определить прозрачность цвета в тех же [0..255] |
| Автор: Cheba 10.6.2004, 00:36 |
| В Win32 значение этого "незадействованого" байта определяет это обычный RGB или системный цвет, напимер цвет кнопок или рабочего стола. |
| Автор: AVA 10.6.2004, 08:06 |
| Ну а как будет выглядеть значение из 8битовой палитры (256 цветов) в этих 32-х битах? |
| Автор: Cheba 11.6.2004, 11:47 |
| Тут есть два варианта. Первый: Индексированый цвет. В этом случае где-то должна быть таблица соответствий, содержащая цвет в RGB и индексы. По индексу можно определить достать нормальный TColor. Второй: Сжатый цвет. В этом случае обычно выделяют 3 бита на красный, 2 - на зеленый и 3 - на синий. Могут быть и иные вариации. В этом случае тоже можно определить значение TColor повозившись немного. Ничего сложного нет. Например для сочетания 3-2-3 значение 179 ($B3, в бинарном виде 10110011) значением TColor будет $009B7E5D. |
| Автор: AVA 11.6.2004, 12:17 | ||
а как можно узнать какой вариант использовался в кодировке (3-2-3 или ещё какой)? |
| Автор: Cheba 11.6.2004, 13:02 |
| Зависит от того где это используется. Ты бы по-конкретней задачу описал... |
| Автор: AVA 11.6.2004, 13:19 |
| Вкратце: есть последовательность байт, которые надо вывести на экран ввиде пикселей разного цвета. Этот экран находится на удаленном рабочем столе и палитра там 256 цветов. Затем у меня, посредством удаленного рабочего стола какой-нить программы захватить эту картинку и преобразовать опять в последовательность байт (но палитра у меня уже труколорная). Вот и получается проблемма закодировать байт в цвет так, чтобы потом система не округлило это значение до своего ближайшего и т.п. |
| Автор: Cheba 11.6.2004, 13:30 |
| Тут все просто (наверное). Поскольку на удаленном рабочем столе виндовская палитра, ты можешь без опасений (наверное) просто убавить глубину цвета битмепа до восьми бит - Винды автоматом преобразуют в ту же палитру что и на удаленной машине. Внимание! Если на удаленной машине работает не обычное приложение, а какая-то игрушка с DirectX или OpenGL, то тут уже хуже. Они могут задавать свою палитру и, наверное, распределение битов. |
| Автор: AVA 11.6.2004, 15:25 |
| На удаленной машине будет находиться мое приложение которое будет кодировать..., Чего-то я такое слышал что при политре 256, около 20 цветов занято системмой, что-то мне подсказывает что это ещё один трабл. |
| Автор: x77 11.6.2004, 17:04 |
| не понял, что за три бита? старшый байт всегда определяет, откуда будут браться значения последующих трёх байтов, ни о каком сжатии здесь речи не идёт. 00 - значения из системной палитры 01 - значения из реализованной палитры 02 - значения из логической палитры контекста устройства (device context), к которому мы обращаемся. по сути, цвет никогда напрямую не задаётся, значения трёх младших составляющих байтов - это всегда просто индекс в соответствующей палитре, задаваемой старшим байтом. то, что мы считаем "чистым цветом" - это просто цвет из системной палитры. про цвета, "занятые системой" тоже не понял. есть стандартные 24 константы, которые можно увидеть в свойствах экрана, на вкладке "Оформление", открыв комбу "Элемент". Это просто константы. которым благополучно можно присвоить любые собственные цвета. Они переопределены в Graphics.pas, но на программировании GUI виндовые цвета никоим образом не сказываются. можно написать MyColor := clBtnFace, можно написать MyColor := clSilver, при стандартных настройках вы получите одинаковый цвет. При нестандартных - разные. вот и всё. Какие тут могут быть траблы? Про преобразование палитры. я опять нифига не понял. зачем её преобразовывать?? вы надеетесь, что 8-битная палитра, преобразованная в 24 бита, вдруг сама себя раскрасит 24 битами вместо восьми? вы получите ту же самую картинку. так нафига её преобразовывать? работайте с 8-битной картинкой и всё, какие здесь проблемы? если я правильно понимаю, картинка будет дёргаться по сети. надо думать, что не в бмп. скорее всего, jpg. вот вам и ответ на все вопросы. преобразовывайте, меняйте глубину цвета (смысла в этом я лично не вижу, но мало ли), для всего этого есть стандартные функции, от управления качеством сжатия (соотв. и размером картинки, что немаловажно), до глубины цвета и метода отображения на экране. |
| Автор: Cheba 11.6.2004, 22:09 |
| x77, задачей AVA является передача данных таким вот извратным методом. На удаленной машине его прога семафорит некоторым количеством цветов. Тоесть байтовый массив преобразуется в битмеп, где каждому значению байта соответствует определенный цвет. Он будет через Remot Desctop захватывать изображение в 8-ми битной палитре и по нему нужно восстановить последовательность байтов. Поэтому ему и нужно преобразование. AVA, предоставь всю возню с палитрами Виндам. 20 цветов он никуда не занимает, тут x77 прав. Винды всегда преобразуют цвет по методу Nearest Color. |
| Автор: BraM's 1.9.2004, 12:09 |
| Народ! Сорри, что поднимаю старую тему, но у меня возникла проблема: Какие биты отвечают за какой цвет в случае 16bit палитры? |