문제

PDF417 (2D 바코드)에 대한 내 자신의 DLL을 이해하고 그리기 위해 노력하고 있습니다. 어쨌든 파일의 실제 도면은 완벽하며 32 비트의 올바른 경계입니다 (흑백 결과). 데이터를 작성할 때 다음은 BMP 버퍼에 대한 포인터의 C ++ Visual Studio 메모리 덤프에서 복사 된 메모리 덤프입니다. 각 행은 다음 행 전에 36 너비로 올바르게 할당됩니다.

게시물의 WordWrap에 대해 죄송하지만 내 출력은 메모리 덤프와 같은 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

다음은 파일을 작성하는 코드입니다. 위의 메모리 덤프 시점에 즉시 Verbatim

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"로 왜곡 된 왜곡의 시작에 주목하십시오. 9 바이트 가치 ...

분명히, 드로잉 부분은 12 줄에 대한 메모리에 모든 것이 제대로 정렬되므로 잘 작동합니다.

도움이 되었습니까?

해결책

복합 모드에서 파일을 열지 않아야합니다. 즉, writable & binary wb+?

"0D"로 왜곡의 시작을 주목하십시오.

CR (Carriage Return) 용 ASCII 코드입니다. Newline이있는 일부 OS에 추가됩니다 (Newline은 실제로 CR/LF 시퀀스). 이진 모드에서 출력을 쓰기 시작하면 사라져야합니다.

코드는 그렇지 않으면 깔끔하게 보입니다. 건배!

다른 팁

당신의 0x0A (\n)는 DOS 형식으로 변환됩니다 0x0D0A (\r\n), 텍스트 모드로 파일을 작성하십시오. 이진 모드로 전환하십시오.

실제로 Java에서 비슷한 작업을 수행했습니다 (BMP 데이터를 열 영수증 프린터에 인쇄). 여러분과 공유하고 싶은 몇 가지가 있습니다.

  1. BMP 이미지 데이터! = Microsoft의 이미지 형식. MS 비트 맵에는 이미지 데이터 전에 약 54 바이트의 헤더 정보가 있습니다. (차이를 깨닫기 전에 하루나 이틀을 보냈습니다)

  2. BMP 이미지 데이터는 왼쪽에서 오른쪽으로, 위에서 아래로, 왼쪽에서 가장 중요한 비트를 읽습니다.

  3. 바코드 이미지의 비트가 1인지 확인하십시오. 이는 1 비트 = 1 픽셀을 의미합니다. 16 진수 "AB"는 이진에서 10101011이며, 그 8 픽셀은 그에 따라 채워집니다.

  4. 바코드 36 바이트 폭이있는 경우 바코드 해상도는 273 x 12가 아닌 288 x 12입니다 (36 * 8 = 288).

  5. 이미지 데이터의 크기는 432 바이트 (12 행의 36 바이트) 여야합니다.

  6. 나는 이것이 무엇을 의미하는지 모른다 :

    어쨌든 파일의 실제 도면은 완벽하며 32 비트의 올바른 경계입니다 (흑백 결과).

흑백은 1 색 또는 다른 색을 의미합니다. 픽셀 (생각 비트)이 채워져 있거나 그렇지 않습니다.

도움이 되었기를 바랍니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top