RGB to indexed color palette, перевод из RGB в палитру 256 цветов |
RGB to indexed color palette, перевод из RGB в палитру 256 цветов |
Билли Боб |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Как подогнать три цвета в один из 256-цветной палитры?
|
Lapp |
Сообщение
#2
|
|||
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
256-цветных палитр есть много. Обычно, адаптеры могли показывать 256 цветов одновременно, но каких именно - выбирало приложение. Вообще, 256 цветов (8 бит) слишком мало, чтоб воспроизвести более-менее ральную цветную картинку. Более того, поскольку 8 не делится на 3, то обычная схема типа RGB в принципе не осуществима. Поэтому обычно 256-цветные палитры все индексированные. Это означает, что там выбраны некоторые цвета и каждому присвоен номер (индекс). Также, есть таблица, в которой каждому индексу соответствует реальный цвет (например, 24-bit RGB). Далее, для представления некоторого цвета, которого нет в этой таблице, есть два способа:
1. dithering - воспроизведение нужного цвета посредством смещения имеющихся; 2. no dothering - просто выбор ближаешего цвета (по восприятию может быть неблизкий). Так что тебе в первую очередь надо выяснить, с какой палитрой ты работаешь. То есть, узнать таблицу индексов цветов.
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
|||
Билли Боб |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Палитра обычная svga256. Я хочу вывести 24-битное изображение, а там у каждого пикселя три цвета, надо каждый как-то преобразовать в более менее похожий цвет моей палитры.
|
Lapp |
Сообщение
#4
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Палитра обычная svga256. Я хочу вывести 24-битное изображение, а там у каждого пикселя три цвета, надо каждый как-то преобразовать в более менее похожий цвет моей палитры. Скажи конкретно, каким драйвером ты пользуешься. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
-TarasBer- |
Сообщение
#5
|
Гость |
> Вообще, 256 цветов (8 бит) слишком мало, чтоб воспроизвести более-менее ральную цветную картинку.
Протестую. Этого более чем достаточно даже в стандартной палитре. Для особо привередливых - можно применить специальные фильтры. А для статичной картинки можно и палитру подогнать. И тогда никто вообще не заметит, что на картинке 256 цветов, даже если его спросить. |
TarasBer |
Сообщение
#6
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Палитра обычная svga256. Я хочу вывести 24-битное изображение, а там у каждого пикселя три цвета, надо каждый как-то преобразовать в более менее похожий цвет моей палитры.
Палитру можно и поменять на оптимизированную. А потом для каждого пиксела смотришь ближайший к нему цвет из палитры, можно учесть отклонение, чтобы применить зашумление. Короче, читать http://stratum.pstu.ac.ru/textbooks/kgrafi...al/addit17.html http://www.codenet.ru/progr/video/pallete.php -------------------- |
Билли Боб |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
|
Lapp |
Сообщение
#8
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Протестую. Этого более чем достаточно даже в стандартной палитре. Для особо привередливых - можно применить специальные фильтры. А для статичной картинки можно и палитру подогнать. Палитру можно и поменять на оптимизированную. Тарас, я спорить не буду, поскольку все определяется конкретными целями и т.п. Скажем, если бы я сказал, что сказал выше, в аудитории полиграфщиков - они бы просто пальцем у виска покрутили: "вы слышали? этот идиот говорил про 8-битную палитру! глупец.." Да и ты сам сделал _несколько_ оговорок в своих доводах )).Цитата А потом для каждого пиксела смотришь ближайший к нему цвет из палитры, Сейчас попробую конкретно объяснить..Такая палитра Так, Билли, этта, Боб, слушай, значить, суда. (я тут запятую не пропустил?)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; 17. Считываешь пиксел своей картинки в переменную Color и выводишь BestFitColor(Color). 18. Важно!! Залезаешь на стол и танцуешь жигу на клаве , потом идешь на кухню и доедаешь все, что осталось в холодильнике. 19. Если все хорошо получилось, постишь сюда файл my_palette256.txt в назидание потомкам. Сообщение отредактировано: Lapp - -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
Сообщение
#9
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Мне кажется, это не лучший способ узнать стандартную палитру. Наверняка, цифры есть в интернете. А я бы и их искать не стал. Я бы просто задал свой массив цветов и при старте программы поменял бы палитру на известную мне.
> if d<m then BestFitColor:=i не взлетит Сообщение отредактировано: TarasBer - -------------------- |
Lapp |
Сообщение
#10
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Мне кажется, это не лучший способ узнать стандартную палитру. Наверняка, цифры есть в интернете. А я бы и их искать не стал. Я бы просто задал свой массив цветов и при старте программы поменял бы палитру на известную мне. )) у всех свои способы. Можно и описанный мной выше автоматизировать тоже )). Цитата > if d<m then BestFitColor:=i доползет как-нить.. ))не взлетит Извиняюсь, одну стрчку забыл в функции. Сейчас исправлю.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
Сообщение
#11
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> )) у всех свои способы. Можно и описанный мной выше автоматизировать тоже )).
Да, только PrtSc не работает в Vesa-режимах. А функцию GetRGBPalette я и не знаю даже... -------------------- |
Билли Боб |
Сообщение
#12
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Lapp, похоже ты сегодня рано встал)) но вот 16 пункт надо опробовать.
|
TarasBer |
Сообщение
#13
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Нет, просто он живёт не в России.
> но вот 16 пункт надо опробовать А ты сам разве не мог додуматься до функции нахождения минимума? -------------------- |
Билли Боб |
Сообщение
#14
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Цитата А ты сам разве не мог додуматься до функции нахождения минимума? Наверное, мог. Только в этом коде надо переменным r,g,b указать тип longint, иначе не катит. Единственный минус - картинка медленно открывается. |
TarasBer |
Сообщение
#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])); -------------------- |
Билли Боб |
Сообщение
#16
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
да, вот так лучше.
|
Lapp |
Сообщение
#17
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Да, этот момент я не учел..
написать Sqr(r - longint(Palette256[i,0])) + Sqr(g - longint(Palette256[i,1])) + Sqr(b - longint(Palette256[i,2])); Спасибо, Тарас, +1. По идее, тут чуть-чуть не хватает типа word.. Но, собственно, без разницы - скорость с longint та же самая, думаю. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
buy zithromax without a prescrip |
Сообщение
#18
|
Гость |
Viagro Pills
|
buy outdated promethazine codein |
Сообщение
#19
|
Гость |
Cialis Y Levitra Genericos
|
what are the most common side ef |
Сообщение
#20
|
Гость |
Clavulanic
|
Текстовая версия | 22.11.2024 20:34 |