Page 1 of 2

Дизеринг на фасме

Posted: Tue Dec 11, 2012 8:24 pm
by Heavyiron
Как-то давным давно наткнулся на интересые картинки, которые выглядят как полноцветные, а состоят всего из 8 цветов. Начал копать и наваял простенькую процедуру на fasm-е, которая умеет делать из 24-бит картинок 8-цветные. Плюс немного поэкспериментировал с алгоритмами. Во вложении 3 програмки, которые демонстрируют 3 алгоритма: Sierra lite, Floyd-Steinberg и Burkes. Первый самый быстрый, третий - самый качественный, но вдвое медленней, чем Sierra. Floyd-Steinberg где-то посередине между ними по скорости и качеству.
Не без помощи diamond-a процедура была оптимизирована. В принципе код писался для возможного улучшения качества картинки на ega/vga разрешениях. Но теперь такое оборудование уже разве что в музеях. Потому может сгодится для чего другого (графические редакторы, например).
Для примера взял файл из википедии, но bmp может быть любым 24-битным (правда его надо отразить по диагонали - такая уж особенность у функции вывода картинки в колибри). Программы простенькие, потому выделение памяти идет вручную и если будет желание потестировать на больших bmp, значение памяти для программы надо будет увеличить.

Re: Дизеринг на фасме

Posted: Tue Dec 11, 2012 8:30 pm
by Heavyiron
Более наглядный пример:

Re: Дизеринг на фасме

Posted: Tue Dec 11, 2012 8:38 pm
by SoUrcerer
Ох, видимо, программы не очень новые?:)
В любом случае, очень полезные модули для редактора могут быть.

Re: Дизеринг на фасме

Posted: Tue Dec 11, 2012 8:49 pm
by Leency
Малополезно, однако выглядит клёво.

Re: Дизеринг на фасме

Posted: Tue Dec 11, 2012 8:54 pm
by dunkaist
Нужно.

Требование отразить картинку, правда, доставляет неудобства.

Залей код на svn, пожалуйста. И так уже часто приходится бродить по форуму в поисках нужной картинки или кода.

Re: Дизеринг на фасме

Posted: Tue Dec 11, 2012 9:01 pm
by IgorA
Интересные алгоритмы, когда разгребусь с работой возможно добавлю эти функции в buf2d.
Скоро можно будет написать графический редактор с разными фильтрами.

Re: Дизеринг на фасме

Posted: Wed Dec 12, 2012 12:57 pm
by Heavyiron
dunkaist wrote:Нужно.

Требование отразить картинку, правда, доставляет неудобства.

Залей код на svn, пожалуйста. И так уже часто приходится бродить по форуму в поисках нужной картинки или кода.
На SVN мне уже требуется функция восстановления пароля, давно ничего не заливал и уже успел потерять бумажку, на которой его записывал.
Насчет отражения - даже не знаю. Просто пошел пока самым простым путем - зашиваю в программу уже подготовленный BMP, процедура его обрабатывает и тут же выводится выводится 7-й функцией. Исходное изображение затирается, дополнительный буфер не используется. Почему 7-я функция выводит изображение снизу вверх справа налево, я не в курсе.
IgorA wrote:Интересные алгоритмы, когда разгребусь с работой возможно добавлю эти функции в buf2d.
Скоро можно будет написать графический редактор с разными фильтрами.
Буду рад, если кому-нибудь код пригодится.

Re: Дизеринг на фасме

Posted: Wed Dec 12, 2012 1:23 pm
by 0CodErr
Heavyiron wrote:Буду рад, если кому-нибудь код пригодится.
Мне уже пригодился:)
Image

Heavyiron, спасибо!

В архиве фильтр, который я попытался прикрутить к своей imgF — вроде работает.

Re: Дизеринг на фасме

Posted: Wed Dec 12, 2012 1:41 pm
by Leency
Проверил, отлично работает.

Image

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

Re: Дизеринг на фасме

Posted: Wed Dec 12, 2012 6:37 pm
by srx
Heavyiron wrote:Насчет отражения - даже не знаю. Просто пошел пока самым простым путем - зашиваю в программу уже подготовленный BMP, процедура его обрабатывает и тут же выводится выводится 7-й функцией. Исходное изображение затирается, дополнительный буфер не используется. Почему 7-я функция выводит изображение снизу вверх справа налево, я не в курсе.
Если я правильно понимаю - особенность bmp'шек. там вроде где-то в заголовке записанно в каком порядке идут значения, каждый редактор ставит по-своему. К примеру я тут недавно выводил через эту же функцию bmp созданный в пэинте на семёрке, у меня отображалось перевёрнуто по вертикали, а не по диагонали.

Re: Дизеринг на фасме

Posted: Wed Dec 12, 2012 8:10 pm
by CleverMouse
Heavyiron wrote:На SVN мне уже требуется функция восстановления пароля, давно ничего не заливал и уже успел потерять бумажку, на которой его записывал.
Загляни в личку.

Re: Дизеринг на фасме

Posted: Wed Dec 12, 2012 8:20 pm
by dunkaist
Heavyiron wrote:Насчет отражения - даже не знаю. Просто пошел пока самым простым путем - зашиваю в программу уже подготовленный BMP, процедура его обрабатывает и тут же выводится выводится 7-й функцией.
Я наивно предположил, что используется libimg. А в твоём случае, похоже, srx прав: в bmp изображение зачастую хранится снизу вверх. Использовать bmp в качестве raw не лучшая идея, я сам на это напарывался.

Вообще, если встречаетесь с изображениями, которые неправильно отображаются (или не открываются совсем) в kiv -- не поленитесь прикрепить их в соответствующую тему. Спасибо.

Re: Дизеринг на фасме

Posted: Fri Dec 14, 2012 8:00 am
by 0CodErr
Heavyiron wrote:Почему 7-я функция выводит изображение снизу вверх справа налево, я не в курсе.
Это потому что данные изображения в файле так хранятся. Это можно определить по значению Height в структуре BITMAPINFOHEADER. Если файл с изображением содержит не зеркально отражённые данные, то в этом случае Height в BITMAPINFOHEADER записывается со знаком минус. Например, чтобы получить такое изображение в фотошопе надо при сохранении поставить флажок "flip row order".

На некоторых изображениях тот фильтр вылетает. Пример такого изображения в архиве.
IgorA wrote:...возможно добавлю эти функции в buf2d.
Я думаю, они больше пригодятся в libimg. Например при конвертировании в монохромное изображение. Полученная картинка будет более информативной.
Leency wrote:Можешь выложить последнюю версию ImgF с этим встроенным фильтром, неудобно каждый раз Browse нажимать, да и мало кто будет знать, что он там есть.
Я же наоборот хотел оставить в меню только часто используемые. Если со временем фильтров будет много, то они просто не поместятся все в меню. Неудобно — это да, ну можно, например, их загружать в меню при запуске, только будет не рационально грузить их все.
Можно временно добавить дизеринг непосредственно в саму программу. Там в архиве было 3 алгоритма — все три добавить?

Re: Дизеринг на фасме

Posted: Fri Dec 14, 2012 12:07 pm
by Leency
Значит нужно будет делать подменю, если фильтров станет много. Не раз виде такой пункт "Редкие фильтры" - в любом случае в 100 раз удобнее, чем загружать каждый по отдельности.

>Там в архиве было 3 алгоритма — все три добавить?
Если они делают одно и то же, то лучше выбрать оптимальный. Или опять же подменю.

Re: Дизеринг на фасме

Posted: Fri Dec 14, 2012 9:19 pm
by IgorA
rev 3105
добавил 3 алгоритма в библиотеку buf2d, сделал пример e8_filters, правда дату в заголовке не поменял на новую
0CodErr wrote:Я думаю, они больше пригодятся в libimg. Например при конвертировании в монохромное изображение. Полученная картинка будет более информативной.
может быть там они и нужнее, но в случае чего убрать всегда легче чем добавить