IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> RGB to indexed color palette, перевод из RGB в палитру 256 цветов
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Как подогнать три цвета в один из 256-цветной палитры?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


256-цветных палитр есть много. Обычно, адаптеры могли показывать 256 цветов одновременно, но каких именно - выбирало приложение. Вообще, 256 цветов (8 бит) слишком мало, чтоб воспроизвести более-менее ральную цветную картинку. Более того, поскольку 8 не делится на 3, то обычная схема типа RGB в принципе не осуществима. Поэтому обычно 256-цветные палитры все индексированные. Это означает, что там выбраны некоторые цвета и каждому присвоен номер (индекс). Также, есть таблица, в которой каждому индексу соответствует реальный цвет (например, 24-bit RGB). Далее, для представления некоторого цвета, которого нет в этой таблице, есть два способа:
1. dithering - воспроизведение нужного цвета посредством смещения имеющихся;
2. no dothering - просто выбор ближаешего цвета (по восприятию может быть неблизкий).

Так что тебе в первую очередь надо выяснить, с какой палитрой ты работаешь. То есть, узнать таблицу индексов цветов.

М
Тема перенесена в раздел "Общие вопросы разработки программ"



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Палитра обычная svga256. Я хочу вывести 24-битное изображение, а там у каждого пикселя три цвета, надо каждый как-то преобразовать в более менее похожий цвет моей палитры.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Билли Боб @ 18.09.2011 7:34) *
Палитра обычная svga256. Я хочу вывести 24-битное изображение, а там у каждого пикселя три цвета, надо каждый как-то преобразовать в более менее похожий цвет моей палитры.

Скажи конкретно, каким драйвером ты пользуешься.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






> Вообще, 256 цветов (8 бит) слишком мало, чтоб воспроизвести более-менее ральную цветную картинку.

Протестую. Этого более чем достаточно даже в стандартной палитре. Для особо привередливых - можно применить специальные фильтры. А для статичной картинки можно и палитру подогнать. И тогда никто вообще не заметит, что на картинке 256 цветов, даже если его спросить.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Палитра обычная svga256. Я хочу вывести 24-битное изображение, а там у каждого пикселя три цвета, надо каждый как-то преобразовать в более менее похожий цвет моей палитры.

Палитру можно и поменять на оптимизированную. А потом для каждого пиксела смотришь ближайший к нему цвет из палитры, можно учесть отклонение, чтобы применить зашумление.
Короче, читать

http://stratum.pstu.ac.ru/textbooks/kgrafi...al/addit17.html
http://www.codenet.ru/progr/video/pallete.php


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Такая палитра
Прикрепленное изображение

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(-TarasBer- @ 18.09.2011 11:53) *
Протестую. Этого более чем достаточно даже в стандартной палитре. Для особо привередливых - можно применить специальные фильтры. А для статичной картинки можно и палитру подогнать.
Цитата(TarasBer @ 18.09.2011 11:58) *
Палитру можно и поменять на оптимизированную.
Тарас, я спорить не буду, поскольку все определяется конкретными целями и т.п. Скажем, если бы я сказал, что сказал выше, в аудитории полиграфщиков - они бы просто пальцем у виска покрутили: "вы слышали? этот идиот говорил про 8-битную палитру! глупец.." Да и ты сам сделал _несколько_ оговорок в своих доводах )).

Цитата
А потом для каждого пиксела смотришь ближайший к нему цвет из палитры,
Сейчас попробую конкретно объяснить..

Цитата(Билли Боб @ 18.09.2011 15:08) *
Такая палитра
Так, Билли, этта, Боб, слушай, значить, суда. (я тут запятую не пропустил?)

1. Выведи все цвета от 0 до 255 на экран (типа как ты привел выше, но чтоб ты знал ТОЧНО, где какой номер).

2. Нажми PrtSc.

3. Идешь в свой любимый редактор (я использовал MS Paint, который в Windows), начинаешь новый рисунок и вставляешь в него буфер (ctrl-V).

4. Сходи на кухню, покушай и свари себе кофе. Работа предстоит долгая и нудная.

5. Используй тул "пипетка" (dropper, color picker), ткни курсором в самый первый цвет (например, это было 123 0 234)

6. Иди в "edit colors" и прочитай там значения RGB для этого цвета.

7. Создай новый текстовый файл в блокноте (или в редакторе FAR), my_palette256.txt, и запиши туда строку:
123 0 234

8. Идешь обратно в редактор картинок, снова выбираешь пипетку и кликаешь в следующий цвет.

9. Снова идешь в color edit и выясняешь значения.

10. Записываешь следующую строку в my_palette256.txt.

11. Продолжаешь это безобразие до опупения (это значит цвет №255 на местном жаргоне)).

12. Проверяешь созданную таблицу выборочно (не менее, чем в 10 цветах).

13. Бережно сохраняешь my_palette256.txt и копируешь его на три разных носителя как минимум.

14. В своей программе предусматриваешь массив:
Palette256: array[0..255,0..2] of byte;

15. Делаешь чтение файла my_palette256.txt в массив Palette256

16. Делаешь функцию типа такой:
function BestFitColor(r,g,b: integer): byte;
var
m: integer;
begin
m:= MaxInt;
for i:=1 to 255 do begin
d:= Sqr(r - Palette256[i,0]) + Sqr(g - Palette256[i,1]) + Sqr(b - Palette256[i,2]);
if d<m then begin
BestFitColor:=i;
m:= d
end
end
end;

17. Считываешь пиксел своей картинки в переменную Color и выводишь BestFitColor(Color).

18. Важно!! Залезаешь на стол и танцуешь жигу на клаве dance.gif, потом идешь на кухню и доедаешь все, что осталось в холодильнике.

19. Если все хорошо получилось, постишь сюда файл my_palette256.txt в назидание потомкам.

Сообщение отредактировано: Lapp -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Мне кажется, это не лучший способ узнать стандартную палитру. Наверняка, цифры есть в интернете. А я бы и их искать не стал. Я бы просто задал свой массив цветов и при старте программы поменял бы палитру на известную мне.

> if d<m then BestFitColor:=i

не взлетит

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(TarasBer @ 19.09.2011 10:17) *
Мне кажется, это не лучший способ узнать стандартную палитру. Наверняка, цифры есть в интернете. А я бы и их искать не стал. Я бы просто задал свой массив цветов и при старте программы поменял бы палитру на известную мне.

)) у всех свои способы. Можно и описанный мной выше автоматизировать тоже )).

Цитата
> if d<m then BestFitColor:=i

не взлетит
доползет как-нить.. ))
Извиняюсь, одну стрчку забыл в функции. Сейчас исправлю..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> )) у всех свои способы. Можно и описанный мной выше автоматизировать тоже )).

Да, только PrtSc не работает в Vesa-режимах.
А функцию GetRGBPalette я и не знаю даже...


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Lapp, похоже ты сегодня рано встал)) но вот 16 пункт надо опробовать. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Нет, просто он живёт не в России.

> но вот 16 пункт надо опробовать

А ты сам разве не мог додуматься до функции нахождения минимума?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Цитата
А ты сам разве не мог додуматься до функции нахождения минимума?

Наверное, мог.

Только в этом коде надо переменным r,g,b указать тип longint, иначе не катит.

Единственный минус - картинка медленно открывается.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Нет, тип переменных менять не надо.
Надо только в выражении
Sqr(r - Palette256[i,0]) + Sqr(g - Palette256[i,1]) + Sqr(b - Palette256[i,2]);
написать
Sqr(r - longint(Palette256[i,0])) + Sqr(g - longint(Palette256[i,1])) + Sqr(b - longint(Palette256[i,2]));


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


да, вот так лучше.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Да, этот момент я не учел..
Цитата(TarasBer @ 19.09.2011 14:56) *
написать
Sqr(r - longint(Palette256[i,0])) + Sqr(g - longint(Palette256[i,1])) + Sqr(b - longint(Palette256[i,2]));

Спасибо, Тарас, +1.
По идее, тут чуть-чуть не хватает типа word.. Но, собственно, без разницы - скорость с longint та же самая, думаю.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Viagro Pills
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.11.2021 9:10
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name