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

مكتبة DevIL الاحترافية ... خطوة بخطوة

مغلق
بدأه Abdullah.Alshammeri في 5 نوفمبر 2005 · 9 رد · 3,174 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مكتبة DevIL .

http://openil.sourceforge.net/

تمهيد ... الجزء الاول :

هذه دروس .. سأضعها ... عن هذه المكتبة .,,,,
لنثبت للجميع ان السي ,,,, ليست مجرد شاشة سوداء او ارجوانية ..

بعد ان ذقت الامرين في تعلم هذه المكتبة ... بالرغم من انها سهلة الا انه لاتوجد دروس متكاملة عنها ... الا درس واحد خاص بـ GL



هذه المكتبة تمكننا من تحميل عشرات الانساق من الصور ..

الانساق التي تستطيع المكتبة فتحها :


.bmp, .cut, .dds, .doom, .gif, .ico, .jpg, .lbm, .mdl, .mng, .pal, .pbm, .pcd, .pcx, .pgm, .pic, .png, .ppm, .psd, .psp, .raw, .sgi, .tga and .tif


اما الانساق التي تستطيع المكتبة حفظها :


.bmp, .dds, .h, .jpg, .pal, .pbm, .pcx, .pgm,.png, .ppm, .raw, .sgi, .tga and .tif.

ولو قارنت هذه المكتبة .. بـ برنامج ACDSee لعرفت قيمتها ..
بل الفوتوشوب .. لايستطيع فتح وحفظ كل هذه الانساق . بالرغم من انه ينفرد ببعض الانساق ...



اضافة لذلك توفر هذه المكتبة .. عدة دوال تمكنك من اضافة تأثيرات للصورة .
وهذه المكتبة تتكامل مع
Opengl
Directx
WIN API
Allegro


كانت هذه المكتبة موجهة في الاساس الى opengl لكن بعد ذلك صارت عامة وتحول اسمها من openil الى DevIL
هذه احد الروايات التي قرأتها : )

والمكتبة تعمل على الويندوز ولينوكس ....
وايضا على عدة مترجمات و لغات
Djgpp, MSVC++, Linux gcc, Delphi, Visual Basic, Power Basic and Dev-C++.

راجع
http://openil.sourceforge.net/features.php



لتحميل اي نوع :


ILuint ImageId;

ilGenImages(1, &ImageId);
ilBindImage(ImageId);
ilLoadImage("monkey.tga");

فقط .......



اذا كنت لاتريد استخدام مكتبات تسهل عليك تحميل الصور فعليك ان تقرأ ملفات الصور بطريقتك وهذا يعني عشرات الاسطر ...

:)



اولا حمل هذه الحزمة :
http://prdownloads.sourceforge.net/openil/...l-SDK-1.6.7.zip


قم بفك الملف المضغوط ..

ستجد ثلاث ملفات DLL هي
DevIL.dll
ILU.dll
ILUT.dll

142bb49aa8.jpg


انسخها الى مجلد system32 ..
يعني في الغالب تجده هنا
c:\WINDOWS\system32


ثم انسخ المكتبات
التالية من المجلد LIB

09dc5efc06.jpg

DevIL
ILU
ILUT





والصقها في مجلد المكتبات الخاص بمترجمك ..
وهذا يختلف من مترجم لاخر ..
لو كنت تستخدم visual c اذهب لمجلد المترجم ..

واتبع :
C:\Program Files\Microsoft Visual Studio\VC98\Lib
الان الصق الملفات اللي نسختها الى ذلك المجلد . طبعا على حسب موقع المترجم عندك ..


الان بقي الملفات الرأسية /

افتح المجلد اللي حملت قبل قليل ...
وبالتحديد مجلد
Devil-SDK-1.6.7\include\IL
انسخ هذه الملفات

il.h
ilu.h
ilut.h
config.h
il_wrap.h
ilu_region.h
devil_internal_exports.h

b2e109d560.jpg

واذهب الى مجلد الملفات الرأسية الخاص بمترجمك .. اذا كنت على الفيجوال سي /
C:\Program Files\Microsoft Visual Studio\VC98\Include
طبع على حسب موقع المترجم .

الان انشأ ملف جديد داخل المجلد include وسمه IL ...

الصق الملفات اللي نسختها قبل قليل .. في المجلد IL



الان انتهى التثبيت ..

بقي شيء واحد وهو ربط المكتبات

بمترجمك ..

اذا كنت تستخدم الفيجوال سي

قبل ان تستدعي الملفات الرأسية اكتب :

#   pragma comment (lib, "DevIL.lib")    
#   pragma comment (lib, "ILU.lib")        
#   pragma comment (lib, "ILUT.lib")


الملفات الرأسية اللي تستدعيها هي /
 

#include <IL/il.h>
#include <IL/ilu.h>
#include <IL/ilut.h>

الان انتهى كل شيء ::

الدرس القادم سنتعلم كيف نستورد صورة .


اذهب لهذا الرابط وحمل الوثائق اذا احببت الاطلاع على الدوال + بعض التعليمات ..وملفات المساعدة .

http://openil.sourceforge.net/docs/index.php


اما السورس كود ... فلايهمنا كثير .. لكن اذا اردت : -

http://umn.dl.sourceforge.net/sourceforge/...DevIL-1.6.7.zip

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 10 أبريل 2014 في 19:28 — السبب: add some tags

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

تمهيد ... الجزء الثاني :

كما تعلمون ... كل مكتبة لها متغيراتها وطريقتها واسلوبها .. اللي يميزها ..

مثلا

WIN API

النوع INT هو نفسه int

النوع UINT هو نفسه unsigned int وهكذا ..

ايضا في مكتبة DevIL ... يوجد عدة انواع .. بسيطة :

هذا الجدول يبين كل نوع ومايقابله

unsigned int ILenum

unsigned char ILboolean

unsigned int ILbitfield

char Lbyte

short ILshort

int ILint

int ILsizei

unsigned char ILubyte

unsigned short ILushort

unsigned int ILuint

float ILfloat

float ILclampf

double ILdouble

double ILclampd

void ILvoid

يوجد عندنا ثلاث مكتبات رئيسية /

1- المكتبة IL

جميع دوال هذه المكتبة تبدا بالبادئة

il

مثلا

ilGetInteger

اما ثوابت هذه المكتبة فتبدأ بـ

IL_

مثلا

IL_RGB

هذه المكتبة مهمتها الاساسية تحميل وحفظ الصور واخذ معلومات عنها .

2- المكتبة ILU

جميع دوال هذه المكتبة تبدا بالبادئة

ilu

مثلا

iluGetString

اما ثوابت هذه المكتبة فتبدأ بـ

ILU_

مثلا

ILU_UPPER_LEFT

مهمة هذه المكتبة الاساسية هي اضافة تأثيرات الى الصورة + تحجيم وتدوير الصورة .

3- المكتبة ILUT

جميع دوال هذه المكتبة تبدا بالبادئة

ilut

مثلا

ilutSetHBitmap

اما ثوابت هذه المكتبة فتبدأ بـ

ILUT_

مثلا

ILUT_D3D_MIPLEVELS

مهمة المكتبة الاساسية هي التكامل مع المكتبات الاخرى

مثل

directx 8-9

OpenGL

Win API

ALLEGRO

SDL

BeOS ... هذه اول مرة اسمع عنها :) ,

وفي الاصدارات القادمة سيتم دعم المزيد حسب كلامهم .

الان اخذنا هذه الجولة السريعة ..

بقي شيء مهم ..

لابد ان تعرف كيف تحمل صورة BMP باستخدام WIN API فقط .

يعني تعرف تستخدم :

BitBlt

LoadBitmap

LoadImage

CreateCompatibleDC

GetDC

راجع ..

/index.ph...ic=65853&st=45#

تم تعديل هذه المشاركة بواسطة الشمري في 5 نوفمبر 2005 في 08:22

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

..

الدرس الاول : تحميل صورة ( من اي نوع يحبه قلبك ) /

اولا لابد ان تربط المكتبات ..

كما وضحنا في التمهيد الجزء الاول ,,,

#   pragma comment (lib, "DevIL.lib")    
#   pragma comment (lib, "ILU.lib")        
#   pragma comment (lib, "ILUT.lib")

ثم تربط الملفات الرأسية التالية /

#include <IL/il.h>
#include <IL/ilu.h>
#include <IL/ilut.h>

الان انت جاهز

اول شيء نحتاجه هو اعداد المكتبة

فلو اردت تستخدم دوال المكتبة IL لازم تعدها ... كيف

تكتب الدالة

	ilInit();

بس : )

الان تريد استخدام دوال المكتبة ILU تعدها ...

	iluInit();

بس : )

الان تريد استخدام المكتبة ILUT .. تعدها ..

	ilutRenderer(ILUT_WIN32);

لاحظ ان هذه الدالة تطلب بارمتر ... تمرر له احد القيم التالية /

ILUT_OPENGL

يعني تريد استخدام المكتبة مع gl

ILUT_ALLEGRO

يعني تريد استخدام المكتبة مع ALLEGRO

ILUT_WIN32

يعني تريد استخدام المكتبة مع WIN API

ILUT_DIRECT3D8

يعني تريد استخدام المكتبة مع dx 8l

ILUT_DIRECT3D9

يعني تريد استخدام المكتبة مع dx 9

نحن اخترنا WIN API .

يعني يصير شكل الكود

.

.

.

  hwnd = CreateWindow(
  " arab team ",
  "s ",
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT, 400, 400,
  NULL, NULL, hInstance, NULL);
  
	ilInit();
	iluInit();
	ilutRenderer(ILUT_WIN32); 


  ShowWindow(hwnd, nCmdShow);

	while(GetMessage(&msg,NULL,0,0)>0)
..


..


..

الان اعلن عن متغير من نوع

ILuint

يعني من نوع unsigned int

هكذا

static ILuint ID;

ستعرف الفائدة بعد قليل .

ثم

تكتب

  ilGenImages ( 1 ,&ID );
  ilBindImage (ID );
	ilLoadImage("image1.jpg");

الدالة ilGenImages تحجز مساحة للصورة .. البارمتر الاول عدد الصور اللي تريد تحميلها

البارمتر الثاني عنوان المتغير الذي سيحمل الصورة ,,, افهمه كذا ,

نحن مررنا له المتغير ID .

اما الدالة ilBindImage فتقوم باختيار هذا المتغير ليحمل الصورة القادمة ( يعني اي صورة قادمة سنحملها ستوضع في هذا المتغير )

الان نحمل الصورة ..

	ilLoadImage("image1.jpg");

الان المتغير ID يحمل الصورة image1.jpg

لاحظ .. لو اردت تحميل صورة من نوع TGA فقط تغير الامتداد image1.tga وهكذا مع باقي الانساق المدعومة .

يصبح شكل الكود

    PAINTSTRUCT ps;
    HDC hdc;
    HDC hdcMem;
    ILuint ID;
    HBITMAP bitmap; 
 	 

	switch (message)
  {
   
   
  case WM_CREATE:

    ilInit();
    iluInit();
    ilutRenderer(ILUT_WIN32); 

  break; 

  case WM_PAINT :
 	 {
        hdc =BeginPaint(hwnd,&ps);
    hdcMem =CreateCompatibleDC(NULL);

   	 ilGenImages ( 1 ,&ID );
   	 ilBindImage (ID );
    ilLoadImage("image1.jpg");

    bitmap= ilutConvertToHBitmap (hdc  );


   	 SelectObject(hdcMem,bitmap);
   	 BitBlt(hdc,0,0,400,400,hdcMem,0 ,0,SRCCOPY);


   	 EndPaint(hwnd,&ps);
  
 	 break;

 	 }

انشأنا DC و DC ميموري ... حتى نخزن الصورة .. وهذا امر اكيد انك تعرفه .. وشرح ذلك خارج نطاق الدرس .

الجديد هنا

bitmap= ilutConvertToHBitmap (hdc  );

bitmap هو مقبض الصورة .. HBITMAP bitmap

الدالة ilutConvertToHBitmap

تحول الصورة الى النوع HBITMAP .. وبالتالي نتعامل معها في win api .

تطلب بارمتر واحد هو HDC الذي تريد نسخ الصورة اليه .

فتعيد قيمة تمثل (مقبض الصورة )

خلاص .. الان انت تحمل مقبض الصورة.... باقي الامور هي تخص win api وليس لها علاقة بdevil .

يستحسن بعد ان تنهي من البرنامج اوعندما لاتحتاج للصورة ..

ان تمسحها ..

باستخدام الدالة

ilDeleteImages

التي تطلب بارمترين الاول عدد الصور التي تريد مسحها .. الثاني عنوان ID الخاص بالصورة ...

في مثالنا السابق .. تكتب كذا

ilDeleteImages(1,&ID );

((( عندما تنسخ الصورة .. من ID الى bitmap في مثالنا السابق .. تكون قد انتهيت من ID وبالتالي يمكنك مسحه من الذاكرة في اي وقت تريد ... ))

المثال بالمرفقات ..

الدرس القادم سيكون حول الدالة الرائعة ilGetInteger

وايضا بعض التلميحات . ان شاء الله .

ثم سنتعلم كيف نحول الصورة من صيغة لاخرى .

واخيرا نتعلم اضافة تأثيرات الى الصور .

ونختم . ان شاء الله .

DevIL_1.zip

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

شكراً على جهودك الرئعة بالمنتدى ونحن متابعينك

#6

شكراً لك على هذه المكتبة وساستخدمها مع مكتبة allegro في اقرب فرصة

وشكراً

#8

كلها ملف واحد :) ,,, اختر اي منها ..

الوصلة هنا بشكل مباشر .

http://internap.dl.sourceforge.net/sourcef...l-SDK-1.6.7.zip

نقرة بالزر الايمن ... ثم حفظ باسم .. save as

تم تعديل هذه المشاركة بواسطة الشمري في 6 نوفمبر 2005 في 09:56

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#9

ممتاز يا شمري ...

فكرة المكتبة : هي تقوم بتحميل الملفات بتهيئتها المختلف و تقوم بعمل تعريب parsing للملفات , و انت تستدعي المكتبة التي تقوم بالرسم لرسم الصورة .

فكرة جميلة :) .

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#10

موضوع رائع جدا :) أنا كنت بفكر فى الموضوع ده من زمان بس الحمد لله أن فى ناس عملته و ريحوني :D

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

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

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