المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : المجموعة الأولى من أكواد vb.net


عبد الله الساهر
Apr 2005, 02:06 AM
اخواني لقد جمعت لكم

مجموعة طيبة من دراستي ومن بعض المواقع والمنتديات

لبعض الأكواد المفيدة ان شاء الله لنا ولكم

وسوف نبدأ بإذن الله هذه المجموعة ولنا وقفات أيضا مع البقية

وبسم الله نبدأ

عبد الله الساهر
Apr 2005, 02:10 AM
التعامل مع الصور و الرسم
مستعرض صور مبسط


نريد ان نعمل برنامج يقوم باستعراض الصور الموجودة على الجهاز ومن ثم اختيار صورة لكي نستعرضها في البرنامج , واليك الكود البسيط:

اولا ضع على الفورم صندوق حوار فتح (open dialog) ومربع صورة و و زر امر (button) واكتب هذا الكود في ال form1 class :


If OpenFileDialog1.ShowDialog = DialogResult.OK Then
PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
End If

شرح الكود: الخاصية showdialog تقوم بعرض صندوق الحوار فتح , واذا اختار المستخدم زر ok على الصورة فان على مربع الصورة ان يعرضها . وقد استخدمنا الخاصية FromFile التي يلزمها وسيط وهو اسم الملف المراد عرضه . والخاصية FromFile موجودة في ال Image class .

عبد الله الساهر
Apr 2005, 02:13 AM
تصغير الصور


اذا اردت تصغير حجم الصورة (الطول والعرض) فعليك بوضع زر و مربع صورة ووضع اي صورة في مربع الصورة ثم نغير اسم مربع الصورة الى Picture1 , ومن ثم نكتب الكود التالي:-



Dim x As Bitmap
x = Picture1.Image.GetThumbnailImage(N2.Value, N1.Value, Nothing, Nothing)
x.Save("c\x.jpg")

شرح الكود: نضع اي متغير وليكن المتغير x ونجعله على هيئة صورة Bitmap .
ثم نستخدم الوظيفة GetThumbnailImage الموجودة في الخاصية Image والتي توجد في الكائن Picture1 .
الوظيفة GetThumbnailImage لها 4 توابع :-

الاول: العرض الذي تريد ان تجعله للصورة .
الثاني: الطول الذي تريد ان تجعله للصورة .
الثالث: يتيح لك الفرصة بان تلغي عملية تصغير الصورة , وفي مثالنا استخدمنا الكلمة المحجوزة nothing (اي اننا لم نستخدم هذا التابع)
الرابع: دائما صفر (nothing)

و الناتج من هذه العملية وضعناه في المتغير x .
وبعدها استخدمنا الوظيفة Save لكي نحفظ الصورة , والوظيفة Save لها تابع واحد وهو :-
مسار الصورة التي تريد حفظها .
ويمكن ان نغير هيئة الصورة (Format) بكل سهولة . ولكن ساجعل كود تحويل هيئة الصورة لاحقا ان شاء الله .

عبد الله الساهر
Apr 2005, 02:15 AM
قلب الصور


اذا اردت القيام بقلب صورة (Rotate) فعليك بانشاء زر امر و مربع صورة ووضع صورة فيه وكتابة الكود التالي:-




Dim x As Bitmap = PictureBox1.Image
x.RotateFlip(RotateFlipType.Rotate180FlipY)
PictureBox1.Image = x




شرح الكود: ننشئ اي متغير وليكن x ونجعله على هيئة صورة bitmap .ثم نحدد ماهي الصورة التي سنتعامل معها وهي Picturebox1.image .

ثم نستخدم الوظيفة RotateFlip والتي لها تابع واحد وهو نوعية القلب .
وهناك انواع كثير سيسردها لك vb.net .
الى الان نحن قلبنا الصورة في المتغير X ولم نقلبها فعليا في مربع الصورة ولنقلبها فعليا يجب علينا ان نجعل الصورة الفعلية تساوي المتغير PictureBox1.Image = x .

عبد الله الساهر
Apr 2005, 02:15 AM
تهيئة الصور Image Format

اذا اردت تغيير هيئة صورة معينة فاكتب الكود التالي:


Dim x As New Bitmap("c:\pic06.jpg")
x.Save("c:\new.bmp", System.Drawing.Imaging.ImageFormat.Bmp)

في البداية قمنا بانشاء متغير x ووضعنا فيه صورة معينة وذلك باستخدام الكلاس Bitmap .
بعد ذلك استخدمنا الدالة Save ولها تابعين:
1-مسار الصورة الجديدة التي تريد حفظها (بالاضافة الى امتداد الصورة)
2- هيئة الصورة (bmp , gif , jpg ....etc).

وبذلك نكون قد انشانا نفس الصورة ولكن بهيئة اخرى(كود مفيد جدا)
اذكر كان في برنامج معمول بالفيجوال بيسك 6 يقوم فقط بتغيير هيئة الصور من bmp الى jpg , ولكني عندما اطلعت على الكود اصابتني صدمة . ما اقدر اوصفلكم كيف كان حجم الكود . ولكن الحمد لله على كل حال .

عبد الله الساهر
Apr 2005, 02:16 AM
التصغير و التكبير

تصغير و تكبير ال PictureBox يتم باستخدام خاصتي ال width , height .
ولكن هاتين الخاصيتين لا تقوم بتصغير او تكبير الصورة . التي تقوم بهذه المهمة هي الدالة GetThumbnailImage . والتي تم شرحها سابقا .

المثال التالي يقوم بتكبير اي صورة في PictureBox1 و يخزنها في مسار d:xxx.bmp


Dim x As Bitmap
x = PictureBox1.Image.GetThumbnailImage(PictureBox1.Wi dth + 100, PictureBox1.Height + 100, Nothing, Nothing)
x.Save("d:xxx.bmp")

عبد الله الساهر
Apr 2005, 02:17 AM
الوان متدرجة

اذا اردت ان تملأ الفورم بلون متدرج فاكتب الكود التالي:



Dim grbrush As System.Drawing.Drawing2D.LinearGradientBrush
grbrush = New System.Drawing.Drawing2D.LinearGradientBrush(New _
Point(0, 0), New Point(Me.Width, Me.Height), Color.Gold, Color.Blue)
Me.CreateGraphics.FillRectangle(grbrush, New Rectangle(0, 0, Me.Width, Me.Height))




اولا: نقوم بانشاء متغير من نوع LinearGradientBrush والذي يقوم بالوظيفة .
ثانيا: نقوم بكتابة وسائط الدالة LinearGradientBrush وهي:


1- نقطة البداية: لكي نجعل اللون يملا الفورم من اوله فيجب وضع القيمة صفر لكل من الx , y .
2- نقطة النهاية: لكي نجعل اللون يملا اخر الفورم فيجب وضع قيمة عرض الفورم لل x , وطول الفورم لل y .
3- اللون الاول.
4- اللون الثاني.

ثالثا: نقوم بانشاء الكائن Graphics للفورم (CreateGraphics)
رابعا: نقوم باستخدام الوظيفة FillRectangle وذلك لكي نملا الفورم باللون المتدرج الذي انشاناه من الوظيفة LinearGradientBrush . والوظيفة FillRectangleلها تابعين :


1- الفرشة او اللون الذي تريد ان تملا الفورم به .

2- المساحة التي تريد ان تملا اللون بها في الفورم . ولهذا نستخدم البنية Rectangle والتي لها التوابع التالية:


1- نقطة x وتبدا من اليسار العلوي : صفر
2- نقطة y وتبدا من اليسار العلوي : صفر .

3- عرض المساحة: عرض الفورم .
4- طول المساحة : طول الفورم.

وبالتالي نكون قد انشانا لون متدرج للفورم . لكن لو اتينا للvb 6 لما جدنا الكلاس LinearGradientBrush والذي ينتظر منك الاوامر .

عبد الله الساهر
Apr 2005, 02:18 AM
تحويل النص الى صورة

الكود التالي يقوم بتحويل النص الى هيئة صورة .



Me.CreateGraphics.DrawString("Hello World!", _
New Font("Verdana", 16), Brushes.MediumSeaGreen, 10, 10)




الدالة DrawString لها 5 توابع :

1- النص الذي تريد تحويله الى صورة .
2- نوع الخط الذي تريد كتابة النص به , وقد استخدمنا الكلاس Font لتحديد اسم الخط وحجمه . و يتيح لك هذا الكلاس Font خيارات عديدة للتلاعب في نصك .
3- نمط النص او لونه : وقد استخدمنا الكلاس Brushes لاختيار نمط ال Brush . وعن نفسي فقد اخترت اللون البحري .
4 , 5 - تحديد موقع الصورة على الفورم وذلك بتحديد ال X, Y .

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

عبد الله الساهر
Apr 2005, 02:20 AM
الحافظة Clipboard


كيف تقوم بنسخ و لصق الصور . الامر بسيط جدا

اليك كود نسخ الصور :


Clipboard.SetDataObject(PictureBox1.Image)

استخدمنا الدالة SetDataObject التابعة للكائن Clipboard ووظيفتها هي نسخ البيانات الى الحافظة .

عبد الله الساهر
Apr 2005, 02:24 AM
كود لصق الصور


If Clipboard.GetDataObject.GetDataPresent(DataFormats .Bitmap) = True Then
PictureBox1.Image = Clipboard.GetDataObject.GetData(DataFormats.Bitmap )
Else
MsgBox("The Clipboard doesn’t contain a bitmap!")
End If



في البداية يجب التاكد فيما اذا كانت هناك صورة في الحافظة و ذلك باستخدام الدالة GetDataPresent

و تابعها هو نوع البيانات التي تريد التاكد فيما اذا كانت موجودة في الحافظة او لا . و بالتالي نستخدم الكلاس DataFormats لنعرف النوع Bitmap .
و اذا كان الناتج True فننا نقوم بلصق الصورة في مربع الصورة و ذلك باستخدام الدالة GetData و تابعها هو نوع البيانات التي تريد لصقها من الحافظة .

عبد الله الساهر
Apr 2005, 02:26 AM
مقدمة في معالجة الصور

الصورة عبارة عن مصفوفة مكونة من قيم الوانها (احمر, ازرق, اخضر) . و كل قيمة من هذه القيم ترسم في نقطة تسمى بكسل Pixel في اداة PictureBox .
و بالتالي اذا اردنا ان نقوم بتغييرات بالصور او ان نقوم بعمل فلتر Filter فما علينا الا ان نقوم بتغيير هذه القيم .

فمثلا اذا اردنا ان نقوم بعكس الوان الصورة Inverse فعلينا ان نقوم بطرح كل لون من الوان الصورة من 255 . فمثلا اذا كانت هناك صورة زرقاء بالكامل (0 , 255 , 0 ) فان المعكوس سيصبح (255 , 0 , 255 ) .

و اذا اردت تمليس الصورة Blur فان العملية اصعب قليلا و لكنها فكرة ذكية جدا .
الفكرة هي ان تجعل الوان الصورة قريبة من بعضها . ولكي تقوم بذلك فعليك باخذ المتوسط من كل 9 نقاط Pixels في الصورة . فاذا كانت هناك نقطة ذات فرق كبير في درجة لونها عن الثمانية النقاط الاخر فان المتوسط سوف يقرب لون هذه النقطة من الوان اخواتها الثمانية .

و كذلك شحذ او تحديد الصور Sharpen فما عليك الا القيام بعكس عملية التمليس .

كما ان هناك عمليات اخرى كثيرة ولكن المهم ان نفهم المبدا وهو انك سوف تتعامل مع الوان الصورة .

و بطبيعة الحال فان فجوال بيسك .نت يدعم هذا النوع من العمليات بدالتين هما GetPixel و SetPixel . اما الاولى فهي للحصول على الوان الصورة , واما الثانية فهي للتعديل في الوان الصورة .

يبقى علينا التطبيق برمجيا بعد الانتهاء من فهم الفكرة نظريا .



عكس الوان الصور

اتبع الخطوات الاتية:

ابدا مشروع ويندوز , ثم اضف زر امر و مربع صورة , ثم اضف صورة من عندك الى مربع الصورة .
بعد ذلك اكتب هذا الكود تحت زر الامر




Dim bmap As New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim i, j As Integer
With bmap
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red = CInt(.GetPixel(j, i).R)
blue = CInt(.GetPixel(j, i).B)
green = CInt(.GetPixel(j, i).G)
bmap.SetPixel(j, i, Color.FromArgb(255 - red, 255 - green, 255 - blue))
Next
PictureBox1.Refresh()
Next
PictureBox1.Refresh()
End With

ساقوم بشرح النقاط الاساسية في هذا الكود .

في بداية الامر قمنا بانشاء متغير و خزنّا فيه الصورة الموجودة في مربع الصورة .

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

ثم قمنا بتجميع النقاط ذات اللون الازرق و تخزينها في المتغير blue . و كذلك اللون الاحمر و الازرق . وذلك عن طريق الدالة GetPixels و التي لها تابعين و هما احداثي النقطة التي تريدها x ,y .

ثم استخدمنا الدالة SetPixel للقيام بعكس الوان الصورة , و التي لها 3 توابع :
الاول و الثاني هما احداثي النقطة التي تريد تغيير لونها .
الثالث : اللون الذي تريده للنقطة . و كما تلاحظ فاننا طرحنا كل لون من 255 لنقوم بعكس الوان الصورة .

و اذا اردت تسريع العملية فقم بحذف

PictureBox1.Refresh()
الاولى لانها تحت عملية التكرار الاولى . ووظيفتها انها تجعلك ترى العملية .

و انشاء الله سوف نتعلم فكرة تمليس الصورة في الدرس القادم و هي فكرة رائعة جدا جدا .

عبد الله الساهر
Apr 2005, 02:29 AM
تمليس الصور

الفكرة كما ذكرت سابقا عبارة عن تقريب درجة الوان النقاط من بعضها . فاذا كانت هناك نقطتين وحدة زرقاء والاخرى خضراء فسوف يتم تقريب لون الزرق الى التركوازي. ويتم ذلك بحساب المتوسط لكل 9 نقاط في الصورة .




Dim bmap As New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim i, j As Integer
With bmap
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red = CInt((CInt(.GetPixel(j - 1, i - 1).R) + _
CInt(.GetPixel(j - 1, i).R) + _
CInt(.GetPixel(j - 1, i + 1).R) + _
CInt(.GetPixel(j, i - 1).R) + _
CInt(.GetPixel(j, i).R) + _
CInt(.GetPixel(j, i + 1).R) + _
CInt(.GetPixel(j + 1, i - 1).R) + _
CInt(.GetPixel(j + 1, i).R) + _
CInt(.GetPixel(j + 1, i + 1).R)) / 9)
green = CInt((CInt(.GetPixel(j - 1, i - 1).G) + _
CInt(.GetPixel(j - 1, i).G) + _
CInt(.GetPixel(j - 1, i + 1).G) + _
CInt(.GetPixel(j, i - 1).G) + _
CInt(.GetPixel(j, i).G) + _
CInt(.GetPixel(j, i + 1).G) + _
CInt(.GetPixel(j + 1, i - 1).G) + _
CInt(.GetPixel(j + 1, i).G) + _
CInt(.GetPixel(j + 1, i + 1).G)) / 9)
blue = CInt((CInt(.GetPixel(j - 1, i - 1).B) + _
CInt(.GetPixel(j - 1, i).B) + _
CInt(.GetPixel(j - 1, i + 1).B) + _
CInt(.GetPixel(j, i - 1).B) + _
CInt(.GetPixel(j, i).B) + _
CInt(.GetPixel(j, i + 1).B) + _
CInt(.GetPixel(j + 1, i - 1).B) + _
CInt(.GetPixel(j + 1, i).B) + _
CInt(.GetPixel(j + 1, i + 1).B)) / 9)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
' Me.Text = Int(100 * i / (PictureBox1.Image.Height - 2)).ToString & "%"
Next
End With
PictureBox1.Refresh()
Me.Text = "Done smoothing image"





(اتبع نفس الخطوات السابقة في عكس الوان الصورة )

كما تلاحظ فان الكود متطابق في بدايته مع كود عكس الوان الصورة .
واحب ان اوضح نقطة وهي -2 الموجودة في التكرار و فائدتها هي استبعاد اطراف الصورة من العملية .

المتغير red : قمنا بجمع قيم الالوان لكل 9 نقاط متجاورة ذات اللون الاحمر ومن ثم قسمتها على 9 لحساب المتوسط .

و كذلك المتغير blue و المتغير green .

و لو جربت ان تحذف عملية المتغير green و المتغير red فان الصورة ستصبح زرقاء تماما .

عبد الله الساهر
Apr 2005, 02:34 AM
تحديد الصور Sharpening

من المعروف ان تحديد الصورة هو عكس تمليسها . و لتحديد صورة يجب ان نجد خزارزمية معينة تبين او تزيد الفرق بين النقاط المختلفة اصلا .
لانه من غير الممكن ان نحدد صورة زرقاء تماما و ليس بها نقاط مختلفة .
لذلك السؤال هو ما هي الخوارزمية التي تزيد الفرق بين النقاط المتجاورة المختلفة اصلا (ذات اللون المختلف) و لا تؤثر على النقاط المتجاورة المتطابقة (ذات اللون الواحد) ؟؟

الجواب هو ان تضيف الفرق بين النقطة الاصلية و النقطة المجاورة الى النقطة الاصلية . و بالتالي اذا كانت النقطتان المتجاورتان ذات لون واحد فان الفرق سيساوي صفر و بالتالي لن تؤثر عليها , وانما التاثير سيحدث على النقاط التي سيكون بين قيمها فرق . و اليك الكود الذي سيوضح العملية





Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim i, j As Integer
With bmap
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red = CInt(.GetPixel(j, i).R) + _
0.5 * CInt((.GetPixel(j, i).R) - CInt(.GetPixel(j - 1, i - 1).R))
If red < 0 Then red = red * -1
green = CInt(.GetPixel(j, i).G) + _
0.5 * CInt((.GetPixel(j, i).G) - CInt(.GetPixel(j - 1, i - 1).G))
If green < 0 Then green = green * -1
blue = CInt(.GetPixel(j, i).B) + _
0.5 * CInt((.GetPixel(j, i).B - CInt(.GetPixel(j - 1, i - 1).B)))
If blue < 0 Then blue = blue * -1
red = Math.Min(red, 255)
green = Math.Min(green, 255)
blue = Math.Min(blue, 255)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done sharpening image"

دعنا ناخذ المتغير red مثلا : j , i هي النقطة الاصلية , اضفنا اليها الفرق بينها و بين النقطة المجاورة . اما عن الضرب في 0.5 فهو لتقليل حجم التفصيل او الفرق الحاصل . يمكنك القسمة على 2 بدلا من الضرب في 0.5
و بعد حساب red يجب التاكد من ان قيمتها موجبة . فاذا كانت سالبة فاننا نضربها ب -1 لتصبح موجبة, لان قيم الالوان بين 0 و 255 . و للتاكد من ان قيمة red اقل او تساوي 255 فاننا نستخدم هذا الكود :


red = Math.Min(red, 255)
الدالة Min تعيد القيمة الاصغر بين قيمتين محددتين , فاذا كانت red اكبر من 255 فان red ستصبح 255 حسب الدالة Min .
و هكذا المتغيرين green و blue .

و لكن لو جربت العملية فستلاحظ ان التنفيذ بطيء للغاية . و لستريعه قليلا فاننا نستخدم صورة مؤقتة في الذاكرة . و اليك الكود:


Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim red, green, blue As Integer
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim i, j As Integer
With tempbmp
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red = CInt(.GetPixel(j, i).R) + _
0.5 * CInt((.GetPixel(j, i).R) - CInt(bmap.GetPixel(j - 1, i - 1).R))
If red < 0 Then red = red * -1
green = CInt(.GetPixel(j, i).G) + _
0.5 * CInt((.GetPixel(j, i).G) - CInt(bmap.GetPixel(j - 1, i - 1).G))
If green < 0 Then green = green * -1
blue = CInt(.GetPixel(j, i).B) + _
0.5 * CInt((.GetPixel(j, i).B - CInt(bmap.GetPixel(j - 1, i - 1).B)))
If blue < 0 Then blue = blue * -1
red = Math.Min(red, 255)
green = Math.Min(green, 255)
blue = Math.Min(blue, 255)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done sharpening image
و مع ذلك فان الاداء غير مرضي لان العملية بطيئة جدا مقارنة مع برامج الرسم زي الفوتو شوب . و هذا يدل على ان هناك خوارزميات اخرى للتعامل مع مثل هذا النوع من معالجة الصور .

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

لتسريع عمليات معالجة الصور السابقة قم بتغير الكود من



Dim bmap = New Bitmap(PictureBox1.Image)

الى


Dim bmap As New Bitmap(PictureBox1.Image)

عبد الله الساهر
Apr 2005, 02:35 AM
زخرفة الصور Embossing

اعتقد ان الجميع يعرف الفلتر المسمى Emboss و الموجود في برامج تحرير الصور المشهورة مثل الفوتوشوب . يقوم هذا الفلتر بابراز براويز او حواف الكائنات الموجودة في الصورة .

يمكننا عمل ذلك بالقيام باخذ الفارق بين كل نقطتين متجاورتين . ولكن غالبا يكون هذا الفارق ضئيل و بالتالي ستظهر الصورة غامقة و لذلك يجب عليك اضافة رقم الى هذا الفارق (مثلا 100 او 128 او 150 ) لزيادة اضاءة الصورة .

new_value = difference + 128


و اليك الكود الخاص بهذه العملية :


Dim bmap As New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim i, j As Integer
Dim red, green, blue As Integer
With bmap
For i = 0 To .Height - 2
For j = 0 To .Width - 2
Dim pixel1, pixel2 As System.Drawing.Color
pixel1 = .GetPixel(j, i)
pixel2 = .GetPixel(j + 1, i + 1)
red = Math.Min(Math.Abs(CInt(pixel1.R) - CInt(pixel2.R)) + 128, 255)
green = Math.Min(Math.Abs(CInt(pixel1.G) - CInt(pixel2.G)) + 128, 255)
blue = Math.Min(Math.Abs(CInt(pixel1.B) - CInt(pixel2.B)) + 128, 255)
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done embossing image"كما تلاحظ فان المتغيرين Pixel1 , Pixel2 هما عبارة عن نقطتين متجاورتين في الصورة



green = Math.Min(Math.Abs(CInt(pixel1.G) - CInt(pixel2.G)) + 128, 255)


* الدالة Min تعيد القيمة الاصغر بين قيمتين . وهي بالتالي تضمن بان القيمة لن تتجاوز ال 255 .

* الدالة Abs تعيد القيمة المطلقة للقيمة . فاذا كانت القيمة سالبة فان الدالة تحولها الى قيمة موجبة . وهي بالتالي تضمن بان القيمة لن تكون سالبة .

عبد الله الساهر
Apr 2005, 02:36 AM
تغبيش الصور Diffusing

بصراحة لم اجد معنى مناسب لكلمة Diffuse . و لكن ستعرف معناها جيدا اذا طبقت الكود . كود تغبيش الصورة يعتمد على جعل الصورة نقاط عشوائية . هذه النقاط العشوائية نقوم بانشائها باستخدام الدالة rnd . و اليك الكود الذي سيبين لك العملية

Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim i As Integer, j As Integer
Dim DX As Integer
Dim DY As Integer
Dim red As Integer, green As Integer, blue As Integer
With tempbmp
For i = 3 To .Height - 3
For j = 3 To .Width - 3
DX = Rnd() * 4 - 2
DY = Rnd() * 4 - 2
red = .GetPixel(j + DX, i + DY).R
green = .GetPixel(j + DX, i + DY).G
blue = .GetPixel(j + DX, i + DY).B
bmap.SetPixel(j, i, Color.FromArgb(red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()
Me.Text = "Done diffusing image"



لاحظ اننا اسندنا القيمة Rnd() * 4 - 2 للمتغيرين DX , DY . استخدمت -2 لكي ات&##1581;اشى حواف الصورة , والا فان خطأ ما سيحدث .

لاحظ ايضا انه كلما زدنا قيمة الرقم العشوائي (4 , 5 , 6 ) فان العملية ستزيد تركيزا . جربها بنفسك .

و احب ان اوضح انه بدون انشاء متغير tempbmp فان العملية ستكون بطيئة جدا و غير مرتبة لان العملية ستؤثر على الصورة نفسها في كل امر و عملية حسابية في حلقة التكرار . و لكن بالمتغير tempbmp فاننا نقوم بالحسابات في الخلفية Background واما التطبيق بالدالة SetPixel فيكون على الصورة نفسها وذلك بالمتغير bmap و بالتالي تكون العملية اسرع و اجمل .

عبد الله الساهر
Apr 2005, 02:37 AM
الاضاءة في الصور Brightness


هل تساءلت يوما عن كيفية تكثيف و تقليل درجة الاضاءة في الصور ؟

الفكرة بسيطة جدا لان فجوال بيسك .نت يدعم خاصية اسمها الفا alpha يمكنك من خلالها تغيير درجة شفافية الصورة . اظن ان الفكرة قد وضحت و اليك الكود الذي يقوم بتقليل درجة الاضاءة في صورة :


PictureBox1.BackColor = Color.Black
Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim red, green, blue As Integer
Dim i, j As Integer
With tempbmp
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red = CInt(.GetPixel(j, i).R)
green = CInt(.GetPixel(j, i).G)
blue = CInt(.GetPixel(j, i).B)
bmap.SetPixel(j, i, Color.FromArgb(200, red, green, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()



كما تلاحظ فاننا في بداية الكود قمنا بتغيير لون الخلفية لاداة مربع الصورة الى الاسود ثم قمنا بتغيير قيمة الفا للصورة تساوي 200 . و قيمتها بين 0 و 255 .
255 : غير شفافة .
0 : شفافة تماما .

و الخاصية الفا هي اول تابع في الدالة SetPixel .
و اذا اردت ان تجعل الصورة اكثر اضاءة فاجعل الخلفية بيضاء white .

عبد الله الساهر
Apr 2005, 02:37 AM
الالوان في الصور

اذا اردت ان تجعل صورتك زرقاء مثلا فاجعل قيمة اللون الاحمر و الاخضر تساوي صفر




Dim bmap = New Bitmap(PictureBox1.Image)
PictureBox1.Image = bmap
Dim tempbmp As New Bitmap(PictureBox1.Image)
Dim red, green, blue As Integer
Dim i, j As Integer
With tempbmp
For i = 1 To .Height - 2
For j = 1 To .Width - 2
red = CInt(.GetPixel(j, i).R)
green = CInt(.GetPixel(j, i).G)
blue = CInt(.GetPixel(j, i).B)
bmap.SetPixel(j, i, Color.FromArgb(0, 0, blue))
Next
PictureBox1.Refresh()
Next
End With
PictureBox1.Refresh()

و اذا اردت مثلا ان تحذف اللون الاخضر في صورتك فاجعل قيمة اللون الاخضر تساوي صفر .

و اظن ان هذه العملية موجودة في فوتو شوب و تسمى ب Channels .

عبد الله الساهر
Apr 2005, 03:11 AM
نحن بحاجة لتفاعلكم


احباب قلبي

صمت الجمال
Apr 2005, 03:01 AM
اخي الفاضل


كم والله احزنني ان يكون هذا الكم الهائل من الأكواد ولا تجد التفاعل


والله انا جدا سعدت بها

وان شاء الله بإنتظار باقي المجموعه التي نسعد ان تكون من نقل وإبداع مشرفنا الذي يقدم لنا دوما المفيد لنا

تسلم لنا

عبد الله الساهر
May 2005, 02:35 AM
ولكن تواجدك هون كل تعب وتواصلك والحرص على طرح الدروس المفيدة لنا لهو خير دليل على حرصك على بذل التعب والجهد لطرح المفيد لنا

أمـ جود ـ
May 2005, 10:17 PM
والله شي مرة حلو وموضوع قوي وجميل والان احب اقولك انني


طبقت كل ماذكرت واتت النتيجة مذهلة وطورت حالي من هذا البرنامج والاكواد


كلمة يجب ان تقال


ربي لايحرمني منك

صمت الجمال
May 2005, 02:43 AM
الهمة أستاذي بإنتظار المجموعة الثانية

عبد الله الساهر
May 2005, 04:46 PM
إن شاء الله قريبا وشبه منتهي منها

صمت الجمال
Sep 2005, 05:04 AM
يستحق التثبيت

الوجيه
Oct 2005, 03:36 AM
اخوي عبد الله الساهر


جميل جدا ان نراك حريا على المعرفة للكل

والله انا في بداياتي مع الفيجوال واحس انني سوف استفيد كثيرا من إبداعاتك

عبد الله الساهر
Oct 2005, 07:26 AM
يعطيك العافية

مجاملة رقيقة الوجيه

اتمنى اكون عند حسن الظن

أمـ جود ـ
Jan 2006, 09:58 AM
دوم عند حسن الظن


متى الاصدارة الثانية من الاكواد

فجر الجروح
Mar 2006, 07:48 PM
شكرا لك

عبادي جدا تميز رائع

عبد الله الساهر
Apr 2006, 02:36 PM
اشكركم جد ا

احساس غريب
Mar 2007, 08:11 AM
شكرا جزيلا

عبد الله الساهر
Mar 2007, 03:40 AM
العفو وياهلا بك