Rgb И Indexed Color

  • Автор темы programmer8329
  • Дата начала
P

programmer8329

Здравствуйте кто нибудь работал с алгоритмом median cut algorithm этот алгоритм используется для перевода формата RGB рисунка в indexed color я находил коды этого алгоритма но на языке с# ( на сайте codeproject .com), но там ничего не понятно правда все работает сам тестировал. В интернете я только на сайте programmersheaven.com /download/15370/1/ZipView.aspx нашел алгопитм на паскале но там без исходников и кажется там ошибки, кто нибудь сможет мне объяснить этот алгоритм. Я помещал сылки с пробелами что бы администраторов не злить.
 
S

sinkopa

Здравствуйте кто нибудь работал с алгоритмом median cut algorithm этот алгоритм используется для перевода формата RGB рисунка в indexed color я находил коды этого алгоритма но на языке с# ( на сайте codeproject .com), но там ничего не понятно правда все работает сам тестировал. В интернете я только на сайте programmersheaven.com /download/15370/1/ZipView.aspx нашел алгопитм на паскале но там без исходников и кажется там ошибки, кто нибудь сможет мне объяснить этот алгоритм. Я помещал сылки с пробелами что бы администраторов не злить.
Объяснения алгоритма (правда на немецком :mellow: ) есть в том юните, который на сайте programmersheaven... скачайте архив и посмотрите процедуру Sample; в конце модуля...
Реализация процедур OpenGrafFile(fn : string);, GetGrafPixel(X,Y : Integer; var R,G,B : Byte ); и CloseGrafFile; зависит от того с какими исходным и конечным графическими форматами вы собираетесь работать... поэтому кода в них и нет. Но чтобы разобраться, как и чего кода по моему в полне достаточно...
Собственно и так понятно.
1. Открываем файл с "большой" палитрой.
2. Обходим в цикле попиксельно, получаем значения RGB, на их основе создаем и заполняем массив (ЦВЕТ/ИНДЕКС) "маленькой" палитры.
3. Потом опять обходим исходную картинку (попиксельно) и получаем (по запросу чвета в RGB) индекс в получившейся "маленькой" палитре.
4. Теперь основе этих данных (новая палитра и RGB подмененный на индекс) можно создавать выходной графический файл (процесс зафисит от формата).
Вы вообще из какого формата и в какой собираетесь конверить? Может Вам какую нибудь готовую библиотеку? :)
Можно попробовать поискать на torry.net например.
Хотите, давайте сюда (или в личку) ссылку на код C# (который с codeproject)... если он Вас устраивает, посмотрим как его перевести в паскаль...

PS Правда тема Вашего вопроса скорее про графику чем про компоненты...
 
P

programmer8329

Вы вообще из какого формата и в какой собираетесь конверить? Может Вам какую нибудь готовую библиотеку?

Это не сложно перевести из одного формата в другой, можно даже сохранить в формате indexed color, но вот только качество сохраненого файла которого переводим в indexed color оставляет желать лучшего, поэтому приходиться пользовать совершеными алгоритмами вроде median и octree algorithm, я сам не плохо програмирует также и на Visual Basic.net но вот с# не занимался вот сылка на ихсодники codeproject .com/KB/recipes/SimplePaletteQuantizer/SimplePaletteQuantizerVS2010v5.zip и еще codeproject .com/Articles/66341/A-Simple-Yet-Quite-Powerful-Palette-Quantizer-in-C просто уберите пробел, вам нужно будет скачать среду Visual C# 2010 на сайте microsoft, если вы могли бы дать в ихсохдника на дельфи любой из этих алгоримтов, а лучше оба я был бы вам очень признателен, я пытался разобраться но окончательно запутался.
 
S

sinkopa

Это не сложно перевести из одного формата в другой, можно даже сохранить в формате indexed color...
... поэтому приходиться пользовать совершеными алгоритмами вроде median и octree algorithm...
Да? Тогда я не понимаю какие у Вас сложности... :)
Вот готовый модуль (Вы сами мне эту ссылку дали) с реализацией алгоритма Median Cut на Delphi.

Всего лишь осталось реализовать 5 процедур:
1. OpenGrafFile('BILD.TGA'); - загрузка файла исходного формата
2. GetGrafPixel( X,Y,R,G,B ); - получение значений R,G,B в координатах X,Y из исходной полноцветной картинки
3. PutPixel(X,Y,Lookup^[Convert24to15( R,G,B )]); - положить индекс новой сжатой палитры в пиксель с координатами X,Y в картинку выходного формата.
4. CloseGraph; - запись заголовка, палитры и матрицы пикселей в файл (в соответствии с правилами выходного формата)
5. CloseGrafFile; - закрытие файлов, освобождение памяти.

Но по-моему Вы все же ошибаетесь. Это как раз самое главное - уметь работать с форматами (входным и выходным). Читать, скажем из TGA файла, записывать в формате к примеру PNG. Понимаете о чем я?

В общем, Вот мой совет. Обратите внимание на библиотеку FreeImage. Живет тут .
Там нет прямой подержки алгоритма Median Cut, зато, в числе прочих, есть более продвинутый (на мой взгляд) NeuQuant.
Почитать про него можно тут
Там есть и сравнительные характеристики NeuQuant с Median Cut.
Если же Вам таки нужен имеенно Median Cut, то процедуры (1) (2) (3) (4) (5) о которых я выше написал, с помошью FreeImage Вы легко сможете реализовать через методы класса TFreeBitmap из этой библиотеки.

PS
Признаюсь... с C# я погорячился... почитал код (на который Вы указали). Там несколько специфических фремворковских классов, реализацию (портироавние в Delphi) которых мне с наскоку не осилить... ;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!