那么,我如何使用 winapi 或使用纯汇编程序从图像中获取字节数组?
与 Linux 不同,Windows(官方)不允许程序的任何操作,但允许调用 WinAPI。
用 C 或汇编语言编写程序都没有关系。
因此,您必须像在 C 程序中使用 WinAPI 一样使用它。
我只需要在打印机上打印一个 .bmp 文件。为此,我使用了 winapi 中的“WritePrinter”函数。
使用WritePrinter你可以写:
- “原始”数据;这意味着:只有特定打印机型号才能理解的数据
- 纯文本(这是您可以使用“文本编辑器”(notepad.exe)创建的内容)
- EMF 数据(某种图形格式)
使用WritePrinter似乎无法发送像素图像数据。
...除非您将像素图像转换为您的打印机型号完全可以理解的数据(这要求您拥有有关打印机的内部信息)。
但是,而不是以下一组 API:
OpenPrinter
StartDocPrinter
StartPagePrinter
WritePrinter
EndPagePrinter
EndDocPrinter
ClosePrinter
...您可能想要使用以下 API 集:
CreateDC
StartDoc
StartPage
- GDI 图形 WinAPI 函数
EndPage
EndDoc
DeleteDC
这些 API 函数允许您使用 GDI 图形 WinAPI 函数(如LineTo、FillRect、Ellipse、SetDIBitsToDevice ...)在打印机上绘制图形,您可以使用这些函数在屏幕上绘制图形。
然后您可以使用SetDIBitsToDevice 函数打印图像。
此函数需要一个指向 BITMAPINFO 结构 (lpbmi) 的指针,该结构位于 .BMP 文件的偏移量 14 (0xE)。
.BMP 文件偏移量 10 (0xA) 处存储的字是图像数据 (lpvBits) 在 .BMP 文件中的偏移量。
因此,您需要将 .BMP 文件加载到内存中某个地址“X”处(例如,通过使用 CreateFile、ReadFile 和 CloseHandle API)。
您读取了存储在地址“X+0xA”中的 32 位字“Y”。
您将值“X+0xE”作为lpbmi 参数和值“X+Y”作为lpvBits 参数传递给SetDIBitsToDevice 函数。