【问题标题】:How to display an image using C++ right in console window?如何在控制台窗口中使用 C++ 显示图像?
【发布时间】:2016-11-14 07:30:33
【问题描述】:

我需要使用 C++(Windows 10)在控制台窗口中显示图像(bmp)。

不按字符显示,因为我已经知道如何显示,而是像普通图像一样逐像素显示图像。

不是通过启动另一个应用程序来在另一个窗口中显示图像,而是在黑色控制台窗口中显示图像。

我已经在互联网上搜索了它,但似乎没有找到不使用诸如 opencv 之类的东西的方法。有没有办法自己做,没有opencv?

【问题讨论】:

  • 您知道控制台窗口只显示文本吗?也没有办法只使用“C++”来做类似的事情,因为 C++ 规范没有说明任何类型的图像的加载、解码或显示。
  • 您可能还想指定您正在使用的平台/操作系统/GUI,因为大多数解决方案都是不可移植的。
  • 是的,当然有。 1.打开并读取文件。 2.绘制像素。你被困在哪里了?解码、颜色量化、像素操作、输出字符的选择?对图像进行阈值化并显示其 2 色调表示是微不足道的 - 解码图像要困难得多。尝试解码未压缩的 BMP、TGA 或 TIFF 图像 - 它们的格式都很容易获得。
  • 平台是放在tag里的,不是title
  • C++ 没有特定的显示概念。所以你需要使用一些外部库。如果您想在终端(控制台)中显示某些内容,则需要与终端的 API 进行交互。因此,请查找您的终端的文档。

标签: c++ windows


【解决方案1】:

如果不使用库,您将无法做到这一点。

一种方法是制作您自己的控制台窗口,让您这样做。

我不确定您的操作系统是否允许您操纵控制台窗口的像素。

【讨论】:

    【解决方案2】:

    哦,只需查看(或逆向工程)caca 代码 ;-)

    见example use。

    【讨论】:

      【解决方案3】:

      您的假设是错误的:通常 C++(或 C)程序甚至可能不会从某个“控制台窗口”启动(例如,它可能以“批处理模式”启动)。特别是,一些 C++ 实现可以在没有任何屏幕(因此没有任何控制台窗口)的计算机上运行(例如数据中心的 Linux 服务器,这是 Internet 上的大多数服务器)。大多数 top500 supercomputers 没有您可以访问的屏幕,但在其上运行的 HPC 软件(例如 Tripoli-4)通常是用 C++ 编码的。嵌入式计算机(例如您的 RaspberryPi)可以在标准 C++(例如 C++11 或 C++14)中编程,无需任何屏幕或控制台窗口(例如,在 2020 年使用为 cross-compilation 配置的最新 GCC 编译器)

      (即使在我不知道也从未使用过的 Windows 上,我确信有一些方法可以在任何“控制台窗口”之前启动程序 - 通过将计算机配置为启动一些守护程序或服务器 -存在)

      因此,您应该更准确地定义您的平台是什么。一般来说,答案可能是特定于平台和操作系统的。另请参阅 OSDEV 以获取开源操作系统的示例:FreeBSD 是一个著名的操作系统,它具有能够编译您的 C++ 应用程序的 GCC 或 Clang 编译器。

      我强烈建议您使用像Qt 这样的可移植图形框架(特别是因为如果您仔细编码,它会使您的代码更加可移植)。当然,您随后需要您的用户拥有它,或者您分发包含 Qt 的代码。还可以考虑使用FLTK 或FOX 或SFML 工具包。

      C++14 标准(以及 C++11 及更早版本)不了解图像或控制台窗口,因此(通常,不提及任何平台或操作系统)您的问题毫无意义。

      研究现有开源程序或用 C++ 编码的库的源代码以获取灵感(在 github 或 gitlab 上),例如 fish shell、KDE、 GCC、Clang static analyzer(它们都应该对你有用)、RefPerSys等等......

      【讨论】:

        【解决方案4】:

        我想我刚刚找到了我需要的东西。 SetPixel()函数达到了我想要的效果。

        虽然这张图片严格来说不是“输出”,但它显示出来了。

        【讨论】:

        • 只需制作一个适当的窗口程序并对位图进行 bitblt 处理,而不是在临时 HDC 上一次绘制一个像素。
        • SetPixel 单独做不了多少,你也没有发布任何代码来展示你如何使用它。如果您最小化然后恢复控制台窗口,图像是否仍然显示?如果不是,那么这不是正确的答案。
        【解决方案5】:

        控制台应用程序只能显示文本,因此您不能直接在此处绘制任何内容。对于绘图,您需要创建 Windows 应用程序(使用 C++、Win32、MFC 或所有其他语言)。

        【讨论】:

          【解决方案6】:

          看看这个project。以下是在终端中显示图像的一些示例:

          【讨论】:

            【解决方案7】:

            我能够使用 SetPixel 函数在控制台中显示图像。您需要下载 EasyBMP 库并将其放入您的 Visual Studio 项目目录中。 我使用了以下代码:

            #include <windows.h>
            #include <iostream>
            #include "EasyBMP.h"
            
            void DrwImage(std::string imagePath, HDC* console);
            int main() 
            {
              //Get current console handle
              HWND console = GetConsoleWindow();
              //Get a handle to console
              HDC dc = GetDC(console);
              // Call DrwImage. It must be a bitmap image
              DrwImage("mybitmap.bmp",&dc);
              return 0;
            }
            void DrwImage(std::string imagePath, HDC* console) {
            
               BMP image;
               image.ReadFromFile(imagePath.c_str());
               //image.SetBitDepth(32);
               for (int x = 0; x < image.TellWidth(); x++)
               {
                   for (int y = 0; y < image.TellHeight(); y++)
                   {
                      int RED = image.GetPixel(x, y).Red;
                      int GREEN = image.GetPixel(x, y).Green;
                      int BLUE = image.GetPixel(x, y).Blue;
            
                      int ALPHA = image.GetPixel(x, y).Alpha;
            
                      COLORREF COLOUR = RGB(RED, GREEN, BLUE);
                      if (ALPHA == 0) {
                          SetPixel(*console, x, y, COLOUR);
                      }
                   }
               }
            }
            

            我注意到如果你在调试模式下运行它,它会抛出一个错误,但如果你直接从命令提示符或文件资源管理器窗口运行它,它应该可以正常工作。我对结果感到非常惊讶。

            请注意,在屏幕上绘制图像真的很慢。对于显示图像,我建议使用 GTK 或 wxWidgets 等 GUI 框架。 GUI 框架已针对执行此类任务进行了很好的优化。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-10-20
              • 2018-06-27
              • 2011-04-04
              • 1970-01-01
              • 2012-09-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多