4

我正在努力理解和绘制我自己的 PDF417(二维条码)DLL。无论如何,文件的实际绘图是完美的,并且在 32 位的正确边界内(作为单色结果)。在写入数据时,以下是从指向 bmp 缓冲区的指针的 C++ Visual Studio 内存转储复制的内存转储。在下一行之前,每一行都正确分配为 36 宽。

对帖子中的自动换行感到抱歉,但我的输出旨在与内存转储具有相同的 36 字节宽,以便您可以更好地看到失真。

当前绘图为 273 像素宽 x 12 像素高,单色...

00 ab a8 61 d7 18 ed 18 f7 a3 89 1c dd 70 86 f5 f7 1a 20 91 3b c9 27 e7 67 12 1c 68 ae 3c b7 3e 02 eb 00 00
00 ab a8 61 d7 18 ed 18 f7 a3 89 1c dd 70 86 f5 f7 1a 20 91 3b c9 27 e7 67 12 1c 68 ae 3c b7 3e 02 eb 00 00
00 ab a8 61 d7 18 ed 18 f7 a3 89 1c dd 70 86 f5 f7 1a 20 91 3b c9 27 e7 67 12 1c 68 ae 3c b7 3e 02 eb 00 00
00 ab 81 4b ca 07 6b 9c 11 40 9a e6 0c 76 0a fc a3 33 70 bb 30 55 87 e9 c4 10 58 d9 ea 0d 48 3e 02 eb 00 00
00 ab 81 4b ca 07 6b 9c 11 40 9a e6 0c 76 0a fc a3 33 70 bb 30 55 87 e9 c4 10 58 d9 ea 0d 48 3e 02 eb 00 00
00 ab 81 4b ca 07 6b 9c 11 40 9a e6 0c 76 0a fc a3 33 70 bb 30 55 87 e9 c4 10 58 d9 ea 0d 48 3e 02 eb 00 00
00 ab 85 7e d0 29 e8 14 f4 0a 7a 05 3c 37 ba 86 87 04 db b6 09 dc a0 62 fc d1 31 79 bc 5c 0a 8e 02 eb 00 00
00 ab 85 7e d0 29 e8 14 f4 0a 7a 05 3c 37 ba 86 87 04 db b6 09 dc a0 62 fc d1 31 79 bc 5c 0a 8e 02 eb 00 00
00 ab 85 7e d0 29 e8 14 f4 0a 7a 05 3c 37 ba 86 87 04 db b6 09 dc a0 62 fc d1 31 79 bc 5c 0a 8e 02 eb 00 00
00 ab 85 43 c5 30 e2 26 70 4a 1a f3 e4 4d ce 2a 3f 79 cd bc e6 de 73 6f 39 b7 9c db ce 6d 5f be 02 eb 00 00
00 ab 85 43 c5 30 e2 26 70 4a 1a f3 e4 4d ce 2a 3f 79 cd bc e6 de 73 6f 39 b7 9c db ce 6d 5f be 02 eb 00 00
00 ab 85 43 c5 30 e2 26 70 4a 1a f3 e4 4d ce 2a 3f 79 cd bc e6 de 73 6f 39 b7 9c db ce 6d 5f be 02 eb 00 00

这是写入文件的代码——从上面的内存转储时立即逐字逐句

FILE *stream; 
if( fopen_s( &stream, cSaveToFile, "w+" ) == 0 ) 
{ 
   fwrite( &bmfh, 1, (UINT)sizeof(BITMAPFILEHEADER), stream ); 
   fwrite( &bmi, 1, (UINT)sizeof(BITMAPINFO), stream ); 
   fwrite( &RGBWhite, 1, (UINT)sizeof(RGBQUAD), stream );
   fwrite( ppvBits, 1, (UINT)bmi.bmiHeader.biSizeImage, stream ); 
   fclose( stream ); 
}

这是实际写入文件的内容。

00 ab a8 61 d7 18 ed 18 f7 a3 89 1c dd 70 86 f5 f7 1a 20 91 3b c9 27 e7 67 12 1c 68 ae 3c b7 3e 02 eb 00 00
00 ab a8 61 d7 18 ed 18 f7 a3 89 1c dd 70 86 f5 f7 1a 20 91 3b c9 27 e7 67 12 1c 68 ae 3c b7 3e 02 eb 00 00
00 ab a8 61 d7 18 ed 18 f7 a3 89 1c dd 70 86 f5 f7 1a 20 91 3b c9 27 e7 67 12 1c 68 ae 3c b7 3e 02 eb 00 00
00 ab 81 4b ca 07 6b 9c 11 40 9a e6 0c 76 0d 0a fc a3 33 70 bb 30 55 87 e9 c4 10 58 d9 ea 0d 48 3e 02 eb 00
00 00 ab 81 4b ca 07 6b 9c 11 40 9a e6 0c 76 0d 0a fc a3 33 70 bb 30 55 87 e9 c4 10 58 d9 ea 0d 48 3e 02 eb
00 00 00 ab 81 4b ca 07 6b 9c 11 40 9a e6 0c 76 0d 0a fc a3 33 70 bb 30 55 87 e9 c4 10 58 d9 ea 0d 48 3e 02
eb 00 00 00 ab 85 7e d0 29 e8 14 f4 0d 0a 7a 05 3c 37 ba 86 87 04 db b6 09 dc a0 62 fc d1 31 79 bc 5c 0d 0a
8e 02 eb 00 00 00 ab 85 7e d0 29 e8 14 f4 0d 0a 7a 05 3c 37 ba 86 87 04 db b6 09 dc a0 62 fc d1 31 79 bc 5c
0d 0a 8e 02 eb 00 00 00 ab 85 7e d0 29 e8 14 f4 0d 0a 7a 05 3c 37 ba 86 87 04 db b6 09 dc a0 62 fc d1 31 79
bc 5c 0d 0a 8e 02 eb 00 00 00 ab 85 43 c5 30 e2 26 70 4a 1a f3 e4 4d ce 2a 3f 79 cd bc e6 de 73 6f 39 b7 9c
db ce 6d 5f be 02 eb 00 00 00 ab 85 43 c5 30 e2 26 70 4a 1a f3 e4 4d ce 2a 3f 79 cd bc e6 de 73 6f 39 b7 9c
db ce 6d 5f be 02 eb 00 00 00 ab 85 43 c5 30 e2 26 70 4a 1a f3 e4 4d ce 2a 3f 79 cd bc e6 de 73 6f 39 b7 9c
db ce 6d 5f be 02 eb 00 00

注意从第 4 行读回文件的结果中以“0d”开始的失真,大约第 15 个字节...... 9个字节值...

显然,绘图部分工作正常,因为 12 行的所有内容都在内存中保持正确对齐。

4

3 回答 3

10

您不应该以复合模式(即可写和二进制)打开文件wb+吗?

请注意以“0d”开始的失真

这是回车 (CR) 的 ASCII 码——在某些操作系统上添加了换行符(其中换行符实际上是 CR/LF 的序列)。一旦您开始以二进制模式写入输出,这应该会消失。

否则,您的代码看起来很整洁。干杯!

于 2009-03-04T15:39:05.893 回答
5

您的0x0A( \n) 被转换为 DOS 格式0x0D0A( \r\n),因为您正在以文本模式写入文件。切换到二进制模式。

于 2009-03-04T15:43:42.700 回答
0

我实际上只是在 java 中做了类似的事情(将 bmp 数据打印到热敏收据打印机)。有几件事想和大家分享:

  1. bmp 图像数据!= 来自 microsoft 的图像格式。MS 位图在任何图像数据之前有大约 54 字节的标头信息。(在我意识到差异之前,我花了一两天的时间来解决这个问题)

  2. bmp 图像数据从左到右、从上到下读取,最高有效位在左侧。

  3. 确保条形码图像的位深度为 1。这意味着 1 位 = 1 像素。十六进制的“ab”是二进制的 10101011,这 8 个像素将被相应地填充。

  4. 如果您有 36 字节宽的条形码,则条形码分辨率为 288 x 12,而不是 273 x 12。(36 * 8 = 288)。

  5. 图像数据的大小应为 432 字节(12 行,每行 36 字节)。

  6. 我不知道这意味着什么:

    无论如何,文件的实际绘图是完美的,并且在 32 位的正确边界内(作为单色结果)。

单色表示它的一种颜色或另一种颜色。像素(思考位)要么被填充,要么未被填充。

希望这可以帮助

于 2009-03-04T15:51:00.717 回答