Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2019, 10:19   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Работа с палитрой 8 бит RRRGGGBB

Обычно при работе с палитрой 8 бит интенсивность цветов изменяется пропорционально. Для красного и зеленого от 0 до 7, для синего от 0 до 3.
Сейчас работаю на ретро компьютер Профи, клон Спектрума. У него есть палитра 16 из 256 цветов RRRGGGBB, только синяя составляющая имеет "виртуальный" третий бит. Вот что написано:
"Так как синяя компонента представлена всего 2-я битами, то считается, что у нее есть младший бит, но он равен всегда 0. Т.е. если мы задаем значение синей компоненты в 11 (т.е. десятичное 3), то для получения белого цвета зелёная и красная компоненты должны быть заданы в значение 110 (десятичное 6). И байт палитры соответствующий белому цвету будет выглядеть как 11011011."

То есть обычно в палитре RRRGGGBB в спектре от белого к черному, белый имеет значение 7 7 3, а у Профи белый цвет, с учетом виртуального бита, имеет значение 6 6 6, но записывается как 6 6 3.
То есть получаем шаг синего цвета: 0 2 4 6, вместо обычных 0 1 2 3
И есть цвета за "границей" белого цвета.

Я не вот в этом ни как не могу разобраться.
Нужно получить формулу по перевода палитры 8бит "стандартных" в 8 бит Профи. А так же 24 бит в 8 бит Профи. Стандартные формулы #rrr*(255/7) #rrr*(255/7) #ggg*(255/3) тут уже не подходят.

Будут у кого мысли? Или направьте к людям кто сможет помочь.
С уважением, Алексей.

Последний раз редактировалось tae1980; 09.07.2019 в 17:33.
tae1980 вне форума Ответить с цитированием
Старый 09.07.2019, 13:27   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
что у нее есть младший бит, но он равен всегда 0.
bbb =bb*2
Цитата:
с учетом виртуального бита
bbb*2{=bbb}*(255/7) ???
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.07.2019, 17:38   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
bbb =bb*2
Цитата:
Сообщение от evg_m Посмотреть сообщение
bbb*2{=bbb}*(255/7) ???
Я не сильно разочарую если скажу, что ничего не понял?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 09.07.2019, 18:48   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
что у нее есть младший бит, но он равен всегда 0
bbb =bb*2 //их(ДВА бита) надо превратить в три "нормальных" бита

с которыми уже можно работать "как обычно" (как указано в вашей формуле)
(bb*2)*(255/7)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.07.2019, 21:09   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
bbb =bb*2 //их(ДВА бита) надо превратить в три "нормальных" бита
с которыми уже можно работать "как обычно" (как указано в вашей формуле)
(bb*2)*(255/7)
В Си я не силен. У нас взаимная не любовь.

Тут проблема иного рода. Обычно белый цвет граница спектра, дальше цветов нет. Он имеет максимальное значение, все биты заполнены, в формате rgb 7 7 3. А у Профи белый цвет 6 6 6 (110 110 11). То есть он не последний цвет спектра, за ним есть ещё цвета. Уж не знаю за чем так сделали. От сюда "плывёт" вся палитра. Вот и нужна формула для переноса цветов. Если перестроить как есть цвета отдают желтизной.
Попробовал ограничить палитру в виде 6 6 6, все что выше игнорировать для чего изменил формулу #rrr*(255/6) #rrr*(255/6) #ggg*(255/3). 7xx и x7x подменяем на 6xxx и x6x соответственно. Цвета стали ближе к реальным. Но появилась краснота (хотя её меньше чем раньше желтизны), и видно, что ряд цветов сливается (это не из-за подмены, она уже учтена).
С уважением, Алексей.

Последний раз редактировалось tae1980; 09.07.2019 в 21:12.
tae1980 вне форума Ответить с цитированием
Старый 09.07.2019, 23:06   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
А у Профи белый цвет 6 6 6 (110 110 11).
Это не совсем правильно записано. Из вашего разъяснения следует, что белый цвет - это 6 6 6 (110 110 11|0).
Вам предложено код цвета bb умножать на 2. Это сдвиг на один бит влево.
Если bb|0 -> 01|0, то после умножения на 2 будет 10|0.
Тут вертикальной чертой показан бит, который всегда в нуле:
Цитата:
"Так как синяя компонента представлена всего 2-я битами, то считается, что у нее есть младший бит, но он равен всегда 0. Т.е. если мы задаем значение синей компоненты в 11 (т.е. десятичное 3), то для получения белого цвета зелёная и красная компоненты должны быть заданы в значение 110 (десятичное 6). И байт палитры соответствующий белому цвету будет выглядеть как 11011011."
Соответственно, после преобразования цвета и получения 3-х битового значения для синего цвета, полученный результат надо сдвинуть вправо на один бит.
Если мной всё правильно было понято.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.07.2019, 02:02   #7
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Тут проблема иного рода.
Пока совершенно не ясно, в чём именно у Вас проблема. Нарушается баланс цвета при переводе в Спектрум? Ну так гасите лишний бит во всех трёх компонентах, может, поможет?
Black Fregat вне форума Ответить с цитированием
Старый 10.07.2019, 08:03   #8
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Соответственно, после преобразования цвета и получения 3-х битового значения для синего цвета, полученный результат надо сдвинуть вправо на один бит.
Нужно время на осмысление. Попробую реализовать на практике.

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Пока совершенно не ясно, в чём именно у Вас проблема.
Покажу. Большое изображение, как отображаться в эмуляторе, малое левое исходное изображение 16 цветов, малое правое изображение перевод в формат Профи. У Профи можно задать только два цвета (paper, ink) на 8 горизонтальных точек (байт), от сюда потеря качества.
Так выглядит изображение после прямого переноса.
2019-07-09_13-00-38.jpg
так выглядит изображение после "выравнивание" белого по 6 6 6
2019-07-09_20-21-33.jpg
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 10.07.2019, 08:18   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
А у Профи белый цвет 6 6 6 (110 110 11)
А почему не 7 7 3 ? Если преобразовать стандартно, то так и будет:
rrr = (color.r * 8) / 256
ggg = (color.g * 8) / 256
bb = (color.b * 4) / 256
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.07.2019, 09:24   #10
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
rrr = (color.r * 8) / 256
То же самое, что (color.r * 7) / 255
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с ems api: корректная работа только при явном указании города mrdemkin JavaScript, Ajax 3 02.03.2015 18:23
Как работать с системной палитрой?? artiom4356 Общие вопросы Delphi 0 29.05.2014 18:56
Задания по работе с палитрой компонентов Additional.(Delphi) Наташок Помощь студентам 1 18.04.2011 21:50
Работа с webbrowser - Фреймы, работа с конкретным феймом в фрейме NewDelphi Фриланс 2 08.10.2009 11:00