2009-03-04 4 views
4

Je travaille sur la compréhension et le dessin de ma propre DLL pour PDF417 (codes à barres 2d). De toute façon, le dessin réel du fichier est parfait, et dans les limites correctes de 32 bits (comme résultat monochrome). Au moment de l'écriture des données, ce qui suit est un vidage de la mémoire tel que copié à partir du vidage de la mémoire C++ Visual Studio du pointeur vers le tampon bmp. Chaque rangée est correctement allouée à 36 de large avant la rangée suivante.Ecriture de données BMP en cours de vidange

Désolé pour le wordwrap dans le message, mais ma sortie était destinée à être la même largeur de 36 octets que le vidage de la mémoire afin que vous puissiez mieux voir la distorsion.

Le dessin en cours est de 273 pixels de large par 12 pixels de haut, monochrome ...

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 

Voici le code pour écrire le fichier sur - verbatim immédiatement au moment de la décharge de la mémoire au-dessus de

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); 
} 

Voici ce que ACTUALLY obtient écrit dans le fichier.

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 

Notez que le début de la distorsion avec le « 0d » dans le résultat de la lecture du fichier de retour dans la 4ème ligne, vers le 15 octets sur ... Ensuite, il y a un peu plus quinconce de qui total, inclinaison de l'image de 9 octets de valeur ...

Évidemment, la partie dessin fonctionne bien car tout reste correctement aligné en mémoire pour les 12 lignes.

Répondre

10

Vous ne devez pas ouvrir le fichier en mode composé, c'est-à-dire en écriture & binaire comme dans wb+?

Notez que le début de la distorsion avec le « 0d »

C'est le code ASCII pour retour chariot (CR) - ajouté sur certains systèmes d'exploitation avec saut de ligne (où un saut de ligne est en fait une séquence de CR/LF). Cela devrait disparaître une fois que vous avez commencé à écrire la sortie en mode binaire.

Votre code semble soigné dans le cas contraire. À votre santé!

+0

MERCI BEAUCOUP !!! Le reste rend tout parfait ... –

5

Votre 0x0A (\n) est converti au format DOS 0x0D0A (\r\n), becouse vous écrire le fichier en mode texte. Passez en mode binaire.

0

En fait, je viens de faire une chose similaire en Java (impression de données BMP à une imprimante de reçus thermique). Il y a deux ou trois choses que je veux partager avec vous:

  1. bmp données d'image = un format d'image de Microsoft. la bitmap MS a environ 54 octets d'informations d'en-tête avant toutes les données d'image. (j'ai passé un jour ou deux à travailler dessus avant que je réalise la différence)

  2. Les données d'image bmp se lisent de gauche à droite, de haut en bas, avec le bit le plus significatif sur la gauche.

  3. assurez-vous que l'image du code-barres a un bitdepth de 1. cela signifie 1 bit = 1 pixel. hexadécimal "ab" est 10101011 en binaire, ces 8 pixels seront remplis en conséquence.

  4. Si vous avez un code-barres de 36 octets de largeur, la résolution du code-barres est de 288 x 12 et non de 273 x 12. (36 * 8 = 288).

  5. les données d'image doivent avoir une taille de 432 octets (12 lignes de 36 octets).

  6. Je ne sais pas ce que cela signifie:

    Quoi qu'il en soit, le dessin réel du fichier est parfait, et dans les limites correctes de 32 bits (comme résultat monochrome).

monochrome signifie que sa soit une couleur ou d'une autre. le pixel (think bit) est soit rempli, soit non.

Espérons que cela aide