#c_sharp #wpf #bitmap #datagrid
Доброго времени суток. Разрабатываю маленькую программку для создания макетов вышивки из изображений. Все алгоритмы уже проработаны. Все работает с учетом палитры ниток и т.п. Вот грубый результат без настройки: Теперь встал вопрос нанесения знаков в клетки для различия ниток (как это обычно делают в таких макетах). Изначально наносил их тем же Graphics, что и создавал шаблон. Но возникло две проблемы: Чтобы уместить символ в клетке необходимо увеличить изображение в разы - страдает время, производительность и память. С минимальным размером изображения, необходимым для читаемости символов макет выглядит мыльно. - печать выйдет в плохом качестве. Посмотрев pdf макеты, выяснил, что там используется таблицы с раскрашенными ячейками и проставленными знаками в них. И тут в голову приходит только DataGrid (очень очень большой такой DataGrid). Что хотелось бы узнать: Правильным ли решением является использование DataGrid для этой цели? Также вопрос по производительности. А также как это все напечатать как вектор. Может быть есть какие-нибудь компоненты для этой цели? P.S.: Гуглю уже вторые сутки ничего более-менее путного не нашел. UPD3: Спасибо @VladD за наводку в сторону Canvas. Решился таки. Сделал по этому примеру. Теперь не знаю как выводить блоки асинхронно. Сам код расчета блоков сделать асинхронным не проблема, но вот дальше не знаю. Вешает UI. Пробовал разные методы, что находим и на stackoverflow, но без результатов. Создал новый вопрос, так как проблема другая: сюда.
Ответы
Ответ 1
Схему для вышивки можно представить в виде той же картинки с очень низким разрешением. Учитывая что палитра ниток сильно меньше палитры доступных для отображения цветов, можно воспользоваться простым приемом: Подготовить (скачать или сделать) векторный шрифт с необходимыми значками. Создать словарь соответствия символов и цветов. Представить картинку как двумерный массив символов И того вся картинка будет в среднем занимать несколько килобайт памяти. Bitmap для этого совсем не нужен. С моделью закончили. Думаю вы и сами до всего этого уже додумались. Теперь дело за малым, показать это все в нужном виде. Сетку можно нарисовать и сохранить с помощью GraphicsPath. Его легко масштабировать и рисовать одной строкой. Но этот путь не даст вам интерактивности, т.е. придется городить неведому зверушку для определения в какую клеточку вы кликнули. Поэтому лучше воспользоваться советом VladD, и рисовать готовые квадратики нужного размера, исходя из масштаба, цвета, который выбираем из словаря, вписывать символы или цвет и символы сразу. При этом можно задать некий минимальный размер квадратика, при котором выводить только цвет без символа. Такой подход позволит и память сэкономить, и не потерять качество картинки при сильном увеличении. Добавим автоскрол для Canvas:Тут можно посмотреть про печать из WPF в принципе, а тут подсмотреть код печати контрола (Canvas - тоже контрол). Ответ 2
Попробуйте использовать OpenGL (в данном случаи SharpGL). Для такой задачи может и слишком тяжелый инструмент, но раз у вас возникают такие сложности, думаю поможет. Предоставляет большие возможности при высокой скорости. Возможно для ваших проблем найдется красивое решение. Тоже раньше были похожие проблемы, не поленился, потратил время на OpenGL и был приятно удивлен. Можно сколь угодно крутить, вертеть, увеличивать/уменьшать, рисовать быстрые динамичные сцены - никаких тормозов при высоком качестве. UPD Примеры для SharpGL: на сайте скачиваем Samples (исходники тут: SharpGL/Samples/). Для информации (см. wikipedia): OpenGL - спецификация, определяющая платформонезависимый (независимый от языка программирования) программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику. SharpGL только один из примеров библиотек для .Net, предоставляющих доступ к OpenGL. Есть еще например OpenTK, Tao Framework.
Комментариев нет:
Отправить комментарий