Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Язык Си. Создание эффекта: разлагание картинки.


Рекомендуемые сообщения

Доброго времени суток!

Хочу написать вот такую небольшую прогу:

Пользователь выбирает любую картинку, а программка делает с ней такой эффект, чтобы картинка сначала "сгнила", а потом превратилась в труху.

Пишу на языке Си под DOS в Borland С++ 3.1. Под винду писать не умею пока. :D

Вопрос 1: Как вставить картинку в прогу? Какая функция это делает? (если такая есть для ДОСа).

Как я понимаю, должна быть такая функция, которая берёт картинку и вставляет её в массив в формате 3 байта на пиксел (R-G-B)..

Вопрос 2: Чтобы сделать такой эффект, мне сказали пользоваться фильтрацией изображения и увеличением контраста. Так вот, если кто подскажет, где найти информацию об алгоритмах данных эффектов, буду оч признателен. :no:

Изменено пользователем DeaD_MoroZ
Ссылка на комментарий
Поделиться на другие сайты

DeaD_MoroZ:

"В любви ничего невозможного нет." Кажется, Пьеха пела... Даже в любви к DOS. Про DOS даже песни есть... :)

Однако под DOS поддерживается стандартно максимум 16 цветов, хотя можно найти специальные библиотеки функций, написанные энтузиастами DOS, расширяющие количество цветов до 256 и даже до 65536. Стоит ли их искать и в них разбираться - другой вопрос. Тем более, что все это было рассчитано под 16-битную DOS с ограничением размера массива в 64 килобайта. А на современном мониторе далеко не 64 тысячи точек, так что тут возникают дополнительные сложности разбиения картинки на части, впрочем, вполне преодолимые, хотя и не без некоторых усилий.

Функция вывода рисунка есть и в стандартном C под DOS: putimage. Однако стандартно она тоже рассчитана на режим в 16 цветов, если больше - надо искать такие библиотеки, в которых есть ее аналог или дописывать эту библиотеку самому по образу и подобию имеющихся в библиотеке функций.

Преобразовать картинку в массив, используемый в функции вывода рисунка, нетрудно - берем спецификацию формата BMP и превращаем каждый байт рисунка (он дает яркость одного из трех базовых цветов пиксела, поэтому обычно на пиксел расходуется в BMP три байта) в несколько бит, полагающихся нашей функции вывода рисунка, то есть редуцируем количество цветов до поддерживаемого функциями нашей библиотеки, после чего склеиваем эти биты в байты массива для функции вывода рисунка.

Насчет "гниения картинки" я не совсем понял, видимо, имеется в виду уменьшение интенсивности цветов, это просто - интенсивность каждого базового цвета каждого пиксела кодируется несколькими битами, представляющими собой число, выражающее интенсивность цвета. Надо просто пробегать по массиву и уменьшать эти числа, после чего выводить снова этот массив.

В труху превратить несложно - постепенно прореживаем массив, заменяя всё больше его элементов нулями.

Увеличение контраста тоже несложно: считаем среднее значение яркости (интенсивности цветов), затем пробегаеи по массиву, делая интенсивность цветов пикселей с яркостью меньше средней еще меньше, а большей - еще больше (по возможности).

Остается единственный вопрос - надо ли вообще осваивать умение бриться топором? :D

P.S.

(чтоб она сгнила и превратилась в труху)
На проклятие похоже :no: Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль:

Спасибо большое за содержательый ответ! :)

С выводом рисунка на экран всё понятно.. Насчёт забивки байтов данных рисунка в массив - я так понял никаких функций нет, которые делают это? Ну. если нет, то придётся читать спецификацию формата и вручную выдирать :1eye:

Про гниение вы правильно поняли, вроде так всё и должно быть, картнка должна терять цвет) Использовать надофильтрацию и даж есть спец. алгоритм этого дела =)

На проклятие похоже

Ага, точняк.. Вот такие вот задания сейчас требуют в универе на 4-м курсе :)

Вообщем, полазию, почитаю. посмотрю. Что-нибудь да и получится :)

P.S: эээх, надо в винде учится прогать... с этим ДОСом далеко не убежишь..

Изменено пользователем DeaD_MoroZ
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...