كيف يمكني أن أضع صورة في برنامجي بال C++
وليس VC ++
أي تحت بيئة ال DOS
الرجاء من يعرف خبرني وشكرا لتعاونكم مسبقا .
كيف يمكني أن أضع صورة في برنامجي بال C++
وليس VC ++
أي تحت بيئة ال DOS
الرجاء من يعرف خبرني وشكرا لتعاونكم مسبقا .
السلام عليكم ,,,
لايمكنك أبدا وضع صورة لكي تظهر على شاشة الدوز السوداء Console ,,,,
لكن يمكنك القيام بذلك دون الفيجوال فقط باستخدام السي++ لكن باستخدام ال Win32 App
,,,
7هذا برنامج يقوم بعرض صوره ذات 16 لون
مكتوب ببرنامج البورلاند سي بلس بلس
اذا كان ممكن احد من رواد الموقع يطور البرنامج ويجعله يتعامل مع اكثر من 16 لون يكون افضل
السلام عليكم
عامة عمل صورة فى الدوس فكرتها بسيطة
لعمل صورة BMP بدقه 256 لون يلزمنا معرفه file header الخاص بالصورة
وباستخدام interrupt 10h الخاص بكارت الشاشه تعمل :)
اولا يجب ان نقوم بالتحويل من Text Mode الذى يستخدم لعرض النصوص فى الدوس 80 X 20
الى Graphics Mode ونحدد دقه العرض
عامة الكود الذى الحقته راعيت انه يكون بلغة C لكى يفهمه الجميع
واستخدمت دقة عرض 320 فى 200
للأسف هذا المشروع لا يتم الا فى Borland لأن VC++ لايسمح لك بـinterrupt
هذا نص الاسيمبلى الذى ينقلنا الى هذا المود
mov ah ,0
mov al,13h
int 10h
كود اسيمبلى بسيط جدا لكن قعال للغاية ...
هذا كود الاسيمبلى الخاص بوضع نقطة على الشاشة
mov bx,0a000h
mov es,bx
mov ax,320
mov cx,y
mul cx
mov di,ax
add di,x
mov al,col
stosb
حيث ان x و y و col متغيرات
عامة هذه الأكواد توضح لك كيفة عمل اى جرافيكس تحتاجه :)
الباقى يعتبر خوارزميات بسيطة لعمل الدائرةه و خلافه
يتميز بورلاند عى VC فى assembler الملحق فى السى معه
و ذلك يمكنا بسهولة للدمح بين C و Assembly
الاسيمبلى موجود فى VC أيضا لكن ليس بقوة borland وغير انه غير مسموح لك باستخدام interrupt عليه
عامه كود وضع نقطة بالاسيمبلى ممكن تيسيطه أكثر لنا كمستخدمين C :)
وذلك باستخدام دالة outportb
ونعملها بالشكل التالى
void set_palette (int color, unsigned char red, unsigned char green, unsigned char blue) {
outportb(0x3C8,color);
outportb(0x3C9,red);
outportb(0x3C9,green);
outportb(0x3C9,blue);
}
كده على مااعتقد وضج لكم كيفية التعامل البسيط مع الجرافيكس بالسى
عامة لنعرف قواعد عامة عن الصورة
الصورة تنقسم الى جزئين :
الجزء الأول و هو Bitmap Header و مساحته 54 و هذا ثابت لانه يجتوى على بيانات الصورة
وهو يتكون من 14 خاصية
أول شيئ لازم يحتوى اول حرفين على b.m
2 - حجم الملف
3- رقم صفرى و دائما يكون صفر
4- عرض البيانات او offset data
5- حجم باقى ملف الرأس
6-عرض الصورة
7-ارتفاع الصورة
8-planes الخاصة بالصورة و دائما 1 هنا
9- عدد bits فى الصوره = 8 هنا يعنى = 256 لون
10- نوع الضغط الخاص بالصورة
11-xScale و yScale12 يحدد مقياس الصورة
13و14- الالوان
الجزء الثانى من الصورة :
يحتوى على بيانات الصورة نفسها والتى تسير حسب قواعد ملف الرأس
لحساب مساحته
Width * Height * Number_of_Byte
يعنى صورة ابعادها 1024 * 668
مساحتها =( 1024 * 668 * 1 )+54
على مااعتقد كده نحن فهمنا خصائص الصورة نقدر نعمل البرنامج الان....
البرنامج ملحق
واتمنى ان اكون قد تمكنت من الشرح لكم .....
وانا فى الخدمة ....
السلام عليكم ,,,
كما يبدو للعيان معلوماتي خاطئة بشأن شاشة الدوز السوداء !!!
وطبعا هو واضح لمن يشغل البرنامج ال Console أيضا يخضع لمبدأ ال Pixel لكن أعتقد فقط في وضعية ال Full Screen ...
ومن الغريب أن العاب الدوز القديمة التي كنا نلعب بها كانت تعرض صورا بشكل فعال ,,,
والالعاب أمثال Mortal Compat 2 وغيرها ...
عموما المثال لذي ذكره الأخ الزميل User_1 يعمل بطريقة ال putpixel حيث ستقوم برسم الصورة pixel تلو الاخر .. مما يعيق الاداء ,,,
وكل مصائب رسم الدوز موجودة في المكتبة graphics.h في مصرف البرولاند ,,
والاعاب القديمة في الدوز كانت تتعامل على مستوى Buffer الخاص بكرت الشاشة وهو المفهوم المشابهه لمفهوم ال DirectX وال GDI في أيامنا الحالية للتعامل مع ال Win32 App ,,,
أكرر أسفي مرة أخرى للأخ zngr عن معلوماتي الخاطئة ,,,,
بالنسبة الى كلام الأخ HGB
استخدام Buffer ليس بمشكلة بالعكس لكى تظهر الصورة بشكل سريع نستحدم Double Buffer
للأسف استحدام DirectX مباشرة يضيع عليك فرصة تعلم كيف تم عمل هذه الاشياء..
بالنسبة لعمل الالعاب القديمة فى الدوس فانها تستخدم تقريبا نفس الكود الذى وضعته اقوى جرافيكس دائما هو الجرافيكس المعمول بالاسيمبلى ....
انا فى المشروع الذى الحقته استخدمت buffer وحيد
كل شيئ بيعمل على VC++ ممكن يتعمل على C++
سواء تصميم او العاب او اى شيئ
كل اللى يقدمه VC++ دوال جاهزه تساعدنا على تقديم كفاءة افضل و اسهل .....
وانا فى الحمة ....
ألف شكر لجميع من شاركوا في الإجابة علي سؤالي .
و لا داعي للأسف ايها العزيز HGB يكفيني انك حاولت مساعدتي و أكرر شكري للجميع
هذا الموضوع مغلق.