Быстрый API 2D-рисования с пиксельной точностью для графического приложения?
Вопрос
Я хотел бы создать кроссплатформенную программу рисования.Единственное требование для написания моего приложения — это точность на уровне пикселей на холсте.Например, я хочу написать свой собственный алгоритм рисования линий, а не полагаться на чужие.Мне не нужна какая-либо форма сглаживания (опять же, требуется контроль уровня пикселей). Я бы хотел, чтобы взаимодействие пользователей с экраном было быстрым и отзывчивым (в зависимости от моей способности писать быстрые алгоритмы).
В идеале я хотел бы написать это на Python или, возможно, на Java в качестве второго варианта.Возможность легко сделать финальное приложение кроссплатформенным является обязательным условием.При необходимости я буду использовать разные API в разных ОС, если смогу написать вокруг них уровень абстракции.Есть идеи?
дополнение:мне нужно умение рисовать на экране.С рисованием в файл я разобрался.
Решение
Только на этой неделе я собрал несколько слайдов и демонстрационный код для создания 2D-графики с использованием OpenGL из Python с использованием библиотеки pyglet.Посмотреть мои вещи можно здесь: http://tartley.com/?p=378
Очень быстро (условно говоря, для Python) мне удалось получить около 1000 независимо позиционированных и ориентированных объектов, перемещающихся по экрану, каждый из которых имеет около 50 вершин.
Он очень портативен, весь код, который я написал в этой среде, работает на Windows, Linux и Mac (и даже в малоизвестных средах, таких как Pypy), и мне даже не приходится об этом думать.
Обновлять: Есть и новые посты на эту же тему: http://tartley.com/?cat=27
Другие советы
А Пиглет библиотека для Python может удовлетворить ваши потребности.Он позволяет использовать OpenGL, кроссплатформенный графический API.Вы можете отключить сглаживание и захватить области экрана в буфер или файл.Кроме того, вы можете использовать его системы обработки событий, загрузки ресурсов и манипулирования изображениями.Вероятно, вы также можете связать его с PIL (библиотекой изображений Python) и, безусловно, с Cairo, популярной кроссплатформенной библиотекой векторной графики.
Я упоминаю Pyglet вместо чистого PyOpenGL, потому что Pyglet обрабатывает множество неприятных вещей OpenGL прозрачно, без каких-либо усилий с вашей стороны.
Мы с другом сейчас работаем над программой рисования, используя Pyglet.Есть несколько особенностей — например, OpenGL всегда имеет двойную буферизацию в OS X, поэтому нам приходится рисовать все дважды, один раз для текущего кадра и еще раз для другого кадра, поскольку они переворачиваются при каждом обновлении дисплея.Вы можете посмотреть наш текущий прогресс в этом репозитории Subversion.(Splatterboard.py в багажнике — это файл, который вы захотите запустить.) Если вы не используете svn, я буду рад выслать вам по электронной почте .zip-файл с последним исходным кодом.Не стесняйтесь красть код, если изучите его.
Если выбор языка открыт, возможно, найдется место для Flash-файла, созданного с помощью Haxe.Haxe — бесплатный полноценный динамический язык программирования.Еще есть связанная с ним Neko, виртуальная машина (например, Java, Ruby, Parrot...), работающая на Mac, Windows и Linux.Будучи в некотором смысле новой улучшенной формой Flash, он, естественно, может рисовать. http://haxe.org/
QT Canvas и QPainter очень хороши для этой работы, если вы хотите использовать C++.и это кроссплатформенный.
Для QT существует привязка Python, но я никогда ее не использовал.
Что касается Java, то с использованием SWT манипуляции с холстом на уровне пикселей довольно сложны и медленны, поэтому я бы не рекомендовал это делать.С другой стороны, Swing's Canvas довольно хорош и отзывчив.Я никогда не использовал опцию AWT, но вы, вероятно, не захотите туда обращаться.
Я бы посоветовал wxPython
Это прекрасная кроссплатформенная система, и вы можете получить попиксельное управление, а если передумаете, вы можете использовать его с такими библиотеками, как pyglet или agg.
Вы можете найти несколько полезных примеров того, что вы пытаетесь сделать, в документации и демоверсиях.