Прежде всего, если вы начинаете в C ++, не начинайте со специфичного для Windows компилятора, такого как Visual C ++. Возьмите хорошую кроссплатформенную IDE, которая поставляется с таким компилятором, как eclipse или code :: blocks . Как и любой проект, вы захотите разделить его на более мелкие задачи, которые вы можете выполнить поэтапно. Похоже, у вас есть пара препятствий.
- Недостаток знаний C ++ (мы все были здесь когда-то)
- Недостаток знаний об изображениях (очень распространенная болезнь)
- Недостаток опыта (мы над этим поработаем)
НЕ позволяйте другим отговаривать вас. Вы МОЖЕТЕ сделать это, и, вероятно, быстрее, чем вы думаете, возможно. ЧИТАЙТЕ одну или две книги о C ++, вы можете обойтись одним проектом, не зная многого, но вы будете часто разочаровываться. Давайте разберем ваш проект на множество маленьких целей. По мере выполнения каждой цели ваша уверенность в C ++ будет расти.
- Смешивание изображений
- Заставка Windows с поддержкой нескольких мониторов
- Канва экрана (directx, opengl, растровые изображения?)
- Таймеры
Сначала давайте посмотрим на проблему смешивания изображений. Я предполагаю, что вы захотите «закрасить» изображение в любой фон окна, который у вас активен. Если у вас будет однотонный фон, вы можете просто сделать это, изменив альфа-прозрачность рассматриваемого изображения между обновлениями холста. По сути, вы хотите усреднить значения цвета каждого пикселя в двух изображениях на основе вашего таймера обновления. В более прямом смысле, чтобы найти элементы красного, зеленого и синего пикселей для любого результирующего пикселя (P3)
N = время отсчета таймера за интервал (секунды / миллисекунды / и т. Д.)
T = тики, которые произошли в этом интервале
P1r = красный пиксельный элемент из изображения 1
P2r = красный пиксельный элемент из изображения 2
P3r = результирующий красный пиксельный элемент для смешанного изображения
P1g = зеленый пиксельный элемент из изображения 1
P2g = зеленый пиксельный элемент из изображения 2
P3g = результирующий зеленый пиксельный элемент для смешанного изображения
P1b = синий пиксельный элемент из изображения 1
P2b = синий пиксельный элемент из изображения 2
P3b = результирующий синий пиксельный элемент для смешанного изображения
P3r = ((T/N * P1r) + ((N-T)/N * P2r))/2
P3g = ((T/N * P1g) + ((N-T)/N * P2g))/2
P3b = ((T/N * P1b) + ((N-T)/N * P2b))/2
Теперь давайте рассмотрим проблему экранных заставок Windows и поддержки нескольких мониторов. Это действительно две отдельные проблемы. Заставки Windows на самом деле представляют собой только обычные .exe скомпилированные файлы с определенной функцией обратного вызова. Вы можете найти множество учебных пособий по настройке функций заставки в сети. Поддержка нескольких мониторов на самом деле будет проблемой при настройке Screen Canvas, о которой мы поговорим далее.
Когда я ссылаюсь на Screen Canvas, я имею в виду область, в которой ваша программа будет выводить визуальные данные. Все приложения или учебные пособия по рендерингу изображений будут в основном относиться к этой же концепции. Если вы находите это особенно интересным, рассмотрите программу для выпускников или учебный курс в Computer Vision. Поверьте мне, вы не пожалеете об этом. В любом случае, учитывая основную природу вашего приложения, я бы рекомендовал не использовать openGL или DirectX, просто потому, что у каждого из них есть свой собственный уровень специфичных для приложения знаний, которые вам необходимо приобрести, прежде чем они будут полезны. С другой стороны, если вам нужны встроенные функции 3d, такие как двойная буферизация и разгрузка графического процессора, я бы выбрал openGL (более независимый от платформы). Множество забавных библиотек изображений также представлены в виде gimmes.
Что касается поддержки нескольких мониторов, это сложная, но не сложная проблема. Вы просто устанавливаете границы холста (границы экрана) в соответствии с геометрией нескольких мониторов. Не должно быть проблем с несколькими мониторами с одинаковым разрешением, может быть сложно с несоответствующими разрешениями монитора (могут быть области холста, не отображаемые на экране и т. Д. Существуют хорошо известные алгоритмы и обходные пути для этих проблем, но, возможно, это выходит за рамки этого вопроса.
Наконец, что касается требуемых таймеров, это должна быть самая простая часть. Windows и Linux обрабатывают время своими странными способами (ПОЧЕМУ MS не реализует STRPTIME), поэтому если вы заинтересованы в переносимости, я бы использовал стороннюю библиотеку. В противном случае просто используйте базовую функциональность windows settimer (), и ваше изображение будет отображено в функции обратного вызова.
Advanced Topic: Эй, если вы все еще читаете, есть ряд интересных алгоритмических улучшений, которые вы можете внести в эту программу. Например, если ваш таймер сбрасывает заданные кванты каждую секунду, вы можете кэшировать первые несколько смешанных изображений и сэкономить некоторое время на обработку (наши глаза не очень хорошо замечают разницу между изменением цветовых градиентов). Если вы используете openGL, вы можете кэшировать наборы смешанных изображений в виде списков отображения (для чего-то нужно использовать всю эту память видеокарты?). Прикольные вещи, удачи!