Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TColor - ?


Автор: AVA 9.6.2004, 15:20
TColor -> 32бита -> 4байта. 3-и из них это RGB цвета, а для чего 4-й?
И ещё вопрос, предположим у меня палитра 256 цветов, то каким образом пределенный цвет из этой палитры впишется в эти 32 бита notify.gif

Автор: 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-х битах? bored.gif

Автор: 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
Цитата(Cheba @ 11.6.2004, 11:47)
Второй: Сжатый цвет.
В этом случае обычно выделяют 3 бита на красный, 2 - на зеленый и 3 - на синий. Могут быть и иные вариации.

а как можно узнать какой вариант использовался в кодировке (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 палитры?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)