我最近几天才看到这个,不知道它是如何工作的。我讲的视频是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
- 有 RLE 压缩的 DIB,但在这种情况下使用未压缩的位图(而且它们实际上很少使用)。
- 除了步幅外,使用 4 字节的倍数行避免了这一点。
关于c++ - 此人如何使用 Microsoft Paint 编码 "Hello World"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588649/