Можно ли нарисовать изображение в консоли с помощью C #? [Дубликат]
Я ищу способ рисовать изображение внутри окна консоли. Подобно тому, как я могу назвать Console.Write(«this will display in the console window»); . Я не уверен, возможно ли это или нет. Я немного поиграл без везения (вероятно, потому, что .NET хочет, чтобы вы использовали winforms для графического программирования). Вот фрагмент того, что я пытаюсь сделать:
using System; using System.Drawing; namespace DisplayImage < class Program < static void Main(string[] args) < using (var bmp = new Bitmap(100, 100)) using (var gr = Graphics.FromImage(bmp)) < gr.FillRectangle(Brushes.Orange, new Rectangle(0, 0, bmp.Width, bmp.Height)); Console.WriteLine("draw image"); gr.DrawImage(bmp, 1, 1); Console.WriteLine("drew image"); >> > >
Есть ли способ сделать это?
Изменить
Есть ли способ манипулировать пикселями в консольном приложении? возможно, я мог бы вручную считывать пиксели из изображения и рисовать каждый отдельный пиксель в консоли. Это просто весело, кстати. Не практический проект, просто учебный проект. Позвольте взломать консоль: -)
quakkels 23 дек. 2013, в 17:33
Поделиться
Если вы можете сделать это с помощью Windows API, то вы можете сделать это в C # (в основном). Если вы не можете сделать это с помощью Windows API, то вы не можете сделать это в C # (в основном).
Как «рисовать» в командной строке windows?
В линуксе консольные приложения часто выводят свой прогресс подобием такого: [####___] 50% , при этом надпись «обновляется» на том же месте в терминале, а не спамит в cmd, как делает count <<"сообщение"<
Отслеживать
задан 29 ноя 2017 в 23:46
91 2 2 серебряных знака 7 7 бронзовых знаков
@Abyx ничего не изменилось. я могу что угодно так поставить в начало строкИ, но сами стрОки так и будут «спамить». а я хочу, чтобы новая строка вставала вместо старой, псевдо-gui такое.
30 ноя 2017 в 0:30
Так вроде уже есть ответы на этот вопрос: cursor position for stdout; SetConsoleCursorPosition
30 ноя 2017 в 2:14
‘\r’ переводит курсор на начало строки. Естественно, в строках не должно быть ‘\n’ — перевода строк. Поскольку символы предыдущего вывода не стираются, то следующий вывод должен быть не короче предыдущего, например, можно пробелов в конец налепить.
30 ноя 2017 в 9:03
Кстати, всякие бегущие строки выводят в ‘std::cerr,’, тогда 1) не будет проблем со сбросом буфера, о котором написали в ответе и 2) можно вывод (если он полезен) ‘std::cout’ перенаправить в файл, а бегущая строка по-прежнему будет на экране.
Рисование в консоли windows на С++
В консоли windows можно рисовать как и в обычном окне. Для этого используется библиотека libgdi. Я использую Qt Creator, и для подключения библиотеки libgdi пришлось прописать в .pro файл проекта путь к libgdi32.a
LIBS += C:\Qt\Tools\mingw810_64\x86_64-w64-mingw32\lib\libgdi32.a
Нарисуем минималистичный рисунок в консоли, пусть это будет белая линия от начала координат (0, 0) в точку (300, 300). По умолчанию, перо которым рисуется в консоли — черного цвета и на черном цвете консоли трудно различимо, поэтому у нас добавляется несколько строчек по созданию белого пера и привязки его к консольному окну. Также возникла ситуация что рисунок появлялся в консоли не при каждом запуске программы, было сделано предположение что рисует быстрее чем заканчиваются вывод консоли на экран и перерисовки консоли стирают рисунок. Предположение подтвердилось путем введения задержки после запуска функцией Sleep(100) и получением стабильной отрисовки.
#include // GetConsoleWindow(), GetDC(). int main() < Sleep(100); // Задержка 100 мс, без этого, иногда, перерисовка окна затирает рисунок HWND hwnd = GetConsoleWindow(); // Находим дескриптор (handle) консольного окна HDC hdc = GetDC(hwnd); // Находим контекст устройства DC - device context HPEN hPen = CreatePen(PS_SOLID, 5, RGB(255, 255, 255)); // Создаем (сплошное перо, толщиной 5 пикселов, белого цвета) SelectObject(hdc, hPen);// Привязываем перо к экрану LineTo(hdc, 300, 300); // Рисуем линию от текущих координат (0, 0) к (300, 300) >
Результат работы программы.
Усложним задачу и нарисуем толстыми, цветными, градиентными линиями синус.
#include // GetConsoleWindow(), GetDC(). #include // std::cout #include // sin() #include // system() int main() < system("chcp 65001"); // Active code page: 65001 (Устанавливает UTF-8) system("cls"); // Очищает окно от предыдущего вывода HWND hwnd = GetConsoleWindow(); // Находим дескриптор (handle) консольного окна HDC hdc = GetDC(hwnd); // Находим контекст устройства DC - device context int x = 0; // Координата x for (float i = 0; i < 3.14 * 30; i += 0.05)< // Итерации рисования int R = fabs(sin(i * 1.3 - 0.3)) * 255; // Циклически меняем значение цвета int G = fabs(sin(i * 1.1 - 0.5)) * 255; // Циклически меняем значение цвета int B = fabs(sin(i * 1.7 - 0.7)) * 255; // Циклически меняем значение цвета COLORREF color = RGB(R, G, B); // Цвет (R, G, B) 0. 255 Меняем цвет в процессе HPEN hPen = CreatePen(PS_SOLID, 5, color); // Создаем перо SelectObject(hdc, hPen); // Привязываем перо к экрану int y = 350 - 340 * sin(i); // Координата y LineTo(hdc, x, y); // Рисуем линию x += 1; // Увеличиваем x для рисования следующей точки DeleteObject(hPen); // Освобождаем ресурсы >ReleaseDC(hwnd, hdc); // Освобождаем ресурсы std::cout
Результат работы программы.
Понравилась страница?
Добавить в закладки
Или поделиться!
Примеры графики на C++
Как рисовать графические объекты в C++ в консоли, допустим, круг, квадрат и другие. Я работаю в DEV C++.
Отслеживать
51.4k 87 87 золотых знаков 267 267 серебряных знаков 508 508 бронзовых знаков
задан 10 июн 2011 в 13:22
413 4 4 золотых знака 14 14 серебряных знаков 33 33 бронзовых знака
Моя вопрос не понимай. Что значит «примеры графических объектов»?
10 июн 2011 в 15:01
Короче, как сделать квадрат и круг на C++
10 июн 2011 в 15:04
Где сделать? В bmp-файле, в окошке, в консоли, на ЧПУ с 250 Вт лазером? Буквами али точками.
10 июн 2011 в 15:07
10 июн 2011 в 15:10
ncurses -> google
10 июн 2011 в 15:11
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Хм. Консоль. Т.к. рисовать настоящую графику в консоли не представляется возможным, то рисование надо делать символами.
Все символы в консоли одинаковой ширины. Значит, можно их рассматривать как точки.
Как вывести, например, квадрат 7х7? Самый простой и дубовый способ:
for(int i=0; i
Если надо его сдвинуть - просто выведем перед ним пустые строки и символы пробела сколько нам надо. И квадрат будет не в углу торчать.
Естественно, для всех стандартных геометрических объектов существуют алгоритмы растеризации (превращения в набор точек). Например, для линии хорошо известен алгоритм Брезенхема. Для круга тоже оный имеется. Или ещё какие.
Почитайте книги по программированию, где в названии есть термины "Компьютерная графика", "Машинная графика", "Алгоритмы машинной графики" и что-то в этом духе. Там всё очень популярно должно объясняться, как именно рисовать объекты, с картинками и алгоритмами.
Вот. Это если подходить "с нуля".
А так, конечно, есть готовые библиотеки для подобных рисований.