c++ - 此人如何使用 Microsoft Paint 编码 "Hello World"?

标签 c++ c paint

我最近几天才看到这个,不知道它是如何工作的。我讲的视频是here :

它是 the top rated answer来自这个堆栈溢出问题:Why was this program rejected by three compilers?

这个位图如何显示“Hello World”的 C++ 程序?

最佳答案

BMP (DIB) 图像由一个 header 组成,后跟未压缩的1 颜色数据(对于 24 bpp 图像,它是每像素 3 个字节,以相反的行顺序存储,行步长为 4 个字节) .

颜色数据的字节用于表示颜色(即它们都不是文件格式“强制”的2,它们都来自每个像素的颜色),并且有一个完美的像素颜色和写入文件的字节1:1对应;因此,使用完美选择的颜色,您实际上可以在文件中写入任何您想要的内容(标题除外)。

当您在记事本中打开生成的文件时,颜色数据将显示为文本;您仍然可以从标题(从 BM 到文本开头的部分)清楚地看到,这是文件格式规定的。

在我看来,这个视频是这样完成的:首先,作者计算了位图所需的大小,并创建了一个正确大小的 DIB 文件,其中填充了一种可以扩展为简单图案的颜色(例如,所有字节 65 => 'A');然后用“有效载荷”代码替换这种模式,如视频所示。

但是请注意,使用记事本手工制作整个东西并非不可能 - 使用颜色选择器对话框、ASCII 表和 DIB 格式的基本知识可以完成,但它会慢得多并且会出错-容易。

More info about the DIB format


  1. 有 RLE 压缩的 DIB,但在这种情况下使用未压缩的位图(而且它们实际上很少使用)。
  2. 除了步幅外,使用 4 字节的倍数行避免了这一点。

关于c++ - 此人如何使用 Microsoft Paint 编码 "Hello World"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588649/

相关文章:

c++ - 如何使用 google test 对 gRPC 异步 C++ 客户端功能进行单元测试

c++ - 推力按键即时排序还是不同的方法?

qt - 如何在 QSpinBox 中绘制破折号而不是 null?

java - 如何在透明JFrame上使用paintComponent重置图形?

c++ - 无法在 Windows 7 x64 上使用 Qt Creator 进行编译

c++ - std::make_unique<SomeWrapper<T>> 中的完美转发不是很完美

c++ - 使用 mmap 和/dev/mem - 可以使用reinterpret_cast吗

c - 如何声明固定大小元素的二维数组指针

c - 在C中修改fopen

java - 线程 "AWT-EventQueue-0"java.lang.NullPointerException 中出现异常 - Paint()