4

私は、PDF417 (2d バーコード) 用の独自の DLL を理解して描画することに取り組んでいます。とにかく、ファイルの実際の描画は完璧で、32 ビットの正しい境界 (モノクロの結果として) にあります。以下はデータ書き込み時のbmpバッファへのポインタのC++ Visual Studioメモリダンプからコピーしたメモリダンプです。各行は、次の行の前に 36 幅に適切に割り当てられます。

投稿のワードラップについては申し訳ありませんが、私の出力はメモリ ダンプと同じ 36 バイト幅になるように意図されていたので、ゆがみがよくわかります。

現在の図面は、幅 273 ピクセル、高さ 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 行目、約 15 バイト目で読み返した結果の「0d」で歪みが始まっていることに注意してください。 9バイト分…

明らかに、すべてが 12 行のメモリ内で適切に配置されているため、描画部分は正常に機能しています。

4

3 に答える 3

10

ファイルを複合モード、つまり書き込み可能でバイナリで開くべきではありませんwb+か?

「0d」で歪みが始まることに注意してください

これはキャリッジ リターン (CR) の ASCII コードです。一部の OS では、改行を使用して追加されます (改行は実際には CR/LF のシーケンスです)。バイナリ モードで出力を書き始めると、これはなくなるはずです。

それ以外の場合、コードはきれいに見えます。乾杯!

于 2009-03-04T15:39:05.893 に答える
0

私は実際にJavaで同様のことをしました(bmpデータをサーマルレシートプリンターに印刷しました)。あなたと共有したいことがいくつかあります:

  1. bmp 画像データ != Microsoft の画像形式。MS ビットマップには、画像データの前に約 54 バイトのヘッダー情報があります。(違いに気付く前に、これに1日か2日費やしました)

  2. bmp 画像データは、左から右、上から下に読み取られ、最上位ビットが左側になります。

  3. バーコード イメージのビット深度が 1 であることを確認してください。これは、1 ビット = 1 ピクセルを意味します。16 進数の "ab" は 2 進数で 10101011 であり、これらの 8 ピクセルはそれに応じて埋められます。

  4. バーコードの幅が 36 バイトの場合、バーコードの解像度は 273 x 12 ではなく 288 x 12 になります (36 * 8 = 288)。

  5. 画像データのサイズは 432 バイト (36 バイト× 12 行) である必要があります。

  6. これが何を意味するのかわかりません:

    とにかく、ファイルの実際の描画は完璧で、32 ビットの正しい境界 (モノクロの結果として) にあります。

モノクロとは、その 1 つの色または別の色を意味します。ピクセル(ビットと考えてください)は埋められているか、埋められていません。

お役に立てれば

于 2009-03-04T15:51:00.717 に答える