سؤال

أنا أعمل على فهم ورسم ملف DLL الخاص بي لـ PDF417 (الرموز الشريطية ثنائية الأبعاد).على أية حال، الرسم الفعلي للملف مثالي، وفي حدود صحيحة تبلغ 32 بت (كنتيجة أحادية اللون).في وقت كتابة البيانات، ما يلي هو تفريغ ذاكرة كما تم نسخه من تفريغ ذاكرة C++ Visual Studio للمؤشر إلى المخزن المؤقت bmp.يتم تخصيص كل صف بشكل صحيح بعرض 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

لاحظ بداية التشويه بـ "0d" في النتيجة من قراءة الملف مرة أخرى في السطر الرابع، حوالي البايت الخامس عشر...بعد ذلك، هناك عدد قليل من الصور المتداخلة التي تؤدي في المجمل إلى انحراف الصورة بمقدار 9 بايت...

من الواضح أن جزء الرسم يعمل بشكل جيد حيث يظل كل شيء محاذيًا بشكل صحيح في الذاكرة للأسطر الـ 12.

هل كانت مفيدة؟

المحلول

ويجب أن لا تقوم بفتح الملف في وضع مركب أي للكتابة وثنائي كما في wb+؟

<اقتباس فقرة>   

لاحظ بداية تشويه مع "0D"

وهذا هو رمز ASCII للحرف إرجاع (CR) - المضافة على بعض أنظمة تشغيل مع السطر الجديد (حيث سطر جديد هو في الواقع سلسلة من CR / LF). هذا يجب ان تذهب بعيدا بمجرد البدء في كتابة الإخراج في الوضع الثنائي.

والتعليمات البرمجية الخاصة بك تبدو أنيق خلاف ذلك. هتاف!

نصائح أخرى

ويحصل على تحويل 0x0A الخاصة بك (\n) إلى DOS شكل 0x0D0A (\r\n)، لأني كنت تكتب الملف في وضع النص. التبديل إلى الوضع الثنائي.

لقد قمت بالفعل بشيء مماثل في جافا (طباعة بيانات bmp إلى طابعة إيصالات حرارية).هناك بعض الأشياء التي أريد مشاركتها معك:

  1. بيانات صورة bmp != تنسيق صورة من Microsoft.تحتوي الصورة النقطية لـ MS على حوالي 54 بايت من معلومات الرأس قبل أي بيانات صورة.(قضيت يومًا أو يومين في العمل على هذا قبل أن أدرك الفرق)

  2. تتم قراءة بيانات صورة bmp من اليسار إلى اليمين، ومن أعلى إلى أسفل، مع وجود الجزء الأكثر أهمية على اليسار.

  3. تأكد من أن صورة الباركود تحتوي على عمق بت يبلغ 1.وهذا يعني 1 بت = 1 بكسل.الرقم السداسي العشري "ab" هو 10101011 بالنظام الثنائي، وسيتم ملء تلك البكسلات الثمانية وفقًا لذلك.

  4. إذا كان لديك رمز شريطي بعرض 36 بايت، فإن دقة الرمز الشريطي هي 288 × 12، وليس 273 × 12.(36 * 8 = 288).

  5. يجب أن يكون حجم بيانات الصورة 432 بايت (12 صفًا من 36 بايت).

  6. لا أعرف ماذا يعني هذا:

    على أية حال، الرسم الفعلي للملف مثالي، وفي حدود صحيحة تبلغ 32 بت (كنتيجة أحادية اللون).

أحادية اللون تعني إما لون واحد أو آخر.البكسل (بت التفكير) إما أن يكون مملوءًا أو أنه ليس كذلك.

أتمنى أن يساعدك هذا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top