【问题标题】:How to get a byte array out of a .bmp file? (winapi\assembler) [duplicate]如何从 .bmp 文件中获取字节数组? (winapi\assembler) [重复]
【发布时间】:2020-03-20 07:29:36
【问题描述】:

我只需要在打印机上打印一个 .bmp 文件。为了做到这一点,我使用了 winapi 的“WritePrinter”功能。问题是 - 它读取图像的字节数组。那么,如何使用 winapi 或使用纯汇编程序从图像中获取字节数组? 谢谢!

【问题讨论】:

  • 你不需要 a 字节数组(这将是微不足道的,因为这是任何文件 I/O 无论如何都会给你的)。您需要一个遵循特定协议的字节数组。您不能只转储任何数据。听起来您将要解决的问题过于简单化了。
  • 好吧,也许你是对的,虽然我在msdn 上找不到任何相关信息。我如何获得“遵循特定协议的字节数组”?它遵循哪个协议?

标签: arrays winapi assembly


【解决方案1】:

那么,我如何使用 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 函数(如LineToFillRectEllipseSetDIBitsToDevice ...)在打印机上绘制图形,您可以使用这些函数在屏幕上绘制图形。

然后您可以使用SetDIBitsToDevice 函数打印图像。

此函数需要一个指向 BITMAPINFO 结构 (lpbmi) 的指针,该结构位于 .BMP 文件的偏移量 14 (0xE)。

.BMP 文件偏移量 10 (0xA) 处存储的字是图像数据 (lpvBits) 在 .BMP 文件中的偏移量。

因此,您需要将 .BMP 文件加载到内存中某个地址“X”处(例如,通过使用 CreateFileReadFileCloseHandle API)。

您读取了存储在地址“X+0xA”中的 32 位字“Y”。

您将值“X+0xE”作为lpbmi 参数和值“X+Y”作为lpvBits 参数传递给SetDIBitsToDevice 函数。

【讨论】:

  • 哇,伙计,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多