Rgb И Indexed Color

Тема в разделе "Delphi - Компоненты", создана пользователем programmer8329, 21 окт 2012.

  1. programmer8329

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

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Объяснения алгоритма (правда на немецком :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 Правда тема Вашего вопроса скорее про графику чем про компоненты...
     
  3. programmer8329

    Регистрация:
    28 июн 2012
    Сообщения:
    19
    Симпатии:
    0
    Это не сложно перевести из одного формата в другой, можно даже сохранить в формате 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, если вы могли бы дать в ихсохдника на дельфи любой из этих алгоримтов, а лучше оба я был бы вам очень признателен, я пытался разобраться но окончательно запутался.
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Да? Тогда я не понимаю какие у Вас сложности... :)
    Вот готовый модуль (Вы сами мне эту ссылку дали) с реализацией алгоритма Median Cut на Delphi.
    http://www.programmersheaven.com/file/graphics/2d/MEDCUT.ZIP
    Всего лишь осталось реализовать 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. Живет тут http://freeimage.sourceforge.net/.
    Там нет прямой подержки алгоритма Median Cut, зато, в числе прочих, есть более продвинутый (на мой взгляд) NeuQuant.
    Почитать про него можно тут http://members.ozemail.com.au/~dekker/NEUQUANT.HTML
    Там есть и сравнительные характеристики NeuQuant с Median Cut.
    Если же Вам таки нужен имеенно Median Cut, то процедуры (1) (2) (3) (4) (5) о которых я выше написал, с помошью FreeImage Вы легко сможете реализовать через методы класса TFreeBitmap из этой библиотеки.

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

Поделиться этой страницей