الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

صورة في ال C++

مغلق
بدأه zngr في 24 نوفمبر 2003 · 6 رد · 1,316 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كيف يمكني أن أضع صورة في برنامجي بال C++

وليس VC ++

أي تحت بيئة ال DOS

الرجاء من يعرف خبرني وشكرا لتعاونكم مسبقا .

#2

السلام عليكم ,,,

لايمكنك أبدا وضع صورة لكي تظهر على شاشة الدوز السوداء Console ,,,,

لكن يمكنك القيام بذلك دون الفيجوال فقط باستخدام السي++ لكن باستخدام ال Win32 App

,,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#3

7هذا برنامج يقوم بعرض صوره ذات 16 لون

مكتوب ببرنامج البورلاند سي بلس بلس

اذا كان ممكن احد من رواد الموقع يطور البرنامج ويجعله يتعامل مع اكثر من 16 لون يكون افضل

proj0004.zip

#4

السلام عليكم

عامة عمل صورة فى الدوس فكرتها بسيطة

لعمل صورة 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

على مااعتقد كده نحن فهمنا خصائص الصورة نقدر نعمل البرنامج الان....

البرنامج ملحق

واتمنى ان اكون قد تمكنت من الشرح لكم .....

وانا فى الخدمة ....

Bitmap_in_Dos.zip

#5

السلام عليكم ,,,

كما يبدو للعيان معلوماتي خاطئة بشأن شاشة الدوز السوداء !!!

وطبعا هو واضح لمن يشغل البرنامج ال Console أيضا يخضع لمبدأ ال Pixel لكن أعتقد فقط في وضعية ال Full Screen ...

ومن الغريب أن العاب الدوز القديمة التي كنا نلعب بها كانت تعرض صورا بشكل فعال ,,,

والالعاب أمثال Mortal Compat 2 وغيرها ...

عموما المثال لذي ذكره الأخ الزميل User_1 يعمل بطريقة ال putpixel حيث ستقوم برسم الصورة pixel تلو الاخر .. مما يعيق الاداء ,,,

وكل مصائب رسم الدوز موجودة في المكتبة graphics.h في مصرف البرولاند ,,

والاعاب القديمة في الدوز كانت تتعامل على مستوى Buffer الخاص بكرت الشاشة وهو المفهوم المشابهه لمفهوم ال DirectX وال GDI في أيامنا الحالية للتعامل مع ال Win32 App ,,,

أكرر أسفي مرة أخرى للأخ zngr عن معلوماتي الخاطئة ,,,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#6

بالنسبة الى كلام الأخ HGB

استخدام Buffer ليس بمشكلة بالعكس لكى تظهر الصورة بشكل سريع نستحدم Double Buffer

للأسف استحدام DirectX مباشرة يضيع عليك فرصة تعلم كيف تم عمل هذه الاشياء..

بالنسبة لعمل الالعاب القديمة فى الدوس فانها تستخدم تقريبا نفس الكود الذى وضعته اقوى جرافيكس دائما هو الجرافيكس المعمول بالاسيمبلى ....

انا فى المشروع الذى الحقته استخدمت buffer وحيد

كل شيئ بيعمل على VC++ ممكن يتعمل على C++

سواء تصميم او العاب او اى شيئ

كل اللى يقدمه VC++ دوال جاهزه تساعدنا على تقديم كفاءة افضل و اسهل .....

وانا فى الحمة ....

#7

ألف شكر لجميع من شاركوا في الإجابة علي سؤالي .

و لا داعي للأسف ايها العزيز HGB يكفيني انك حاولت مساعدتي و أكرر شكري للجميع

هذا الموضوع مغلق.

مواضيع مشابهة