له أخي الكريم Moam ماحلك تنسى برنامجك...الفلتر الأول يلغي الثاني عند تطبيقه على الصورة
نقاش : للتعديل على الصور
eias كتب:الفلتر الأول يلغي الثاني عند تطبيقه على الصورة
آسف على التأخر,
بالنسبة لتطبيق الفلتر الثاني على الصورة بعد تطبيق الفلتر الأول , يمكن القيام بذلك بإضافة هذا الكود إلى الـ ApplyFilter
Sub و يجب إضافة هذا الكود تماماً قبل الجملة End Sub و أما الكود فهو
m_OriginalBitmap = picResult.Image
انظر إلى هذه البساطة !!
سلام :lol:
يا سلام عليك يا MoaM فعلا الطريقة صحيحة ...(بس ماناوي تعمل لنا توضيح بسيط عن الكود ^.^ ^.^)
يا جماعة لماذا انتم ساكتون هكذا..هيا انهالوا على MoaM شكرا
eias كتب:بس ماناوي تعمل لنا توضيح بسيط عن الكود
قريباً إن شاء الله , و لكن أتت المدرسة و ... أفففف :(
بالمناسبة , يجب أن نضع بعض أمثلة أخرى (ليس وعد) و يصبح الموضوع جديراً بالتثبيت :lol:
تم تعديل هذه المشاركة بواسطة MoaM في 19 سبتمبر 2005 في 13:15
كود بسيط جداً لتنشيط الموضوع قليلاً <_< ,
عكس ألوان الصورة بالاعتماد على دوال الـ API
الكود مشروح :lol:
'أنشئ مشروع جديد و أضف إليه زر جديد ' أضف أيضاً مربع صورة ' قم بوضع أي صورة في مربع الصورة Private Type BITMAP bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long Dim PicBits() As Byte, PicInfo As BITMAP Dim Cnt As Long, BytesPerLine As Long Private Sub Command1_Click() ' إحضار معلومات عن الصورة (مربع الصورة) مثل الطول و العرض GetObject Picture1.Image, Len(PicInfo), PicInfo 'إعادة تحديد مكان التخزين BytesPerLine = (PicInfo.bmWidth * 3 + 3) And &HFFFFFFFC ReDim PicBits(1 To BytesPerLine * PicInfo.bmHeight * 3) As Byte 'نسخ البايتات إلى مصفوفة GetBitmapBits Picture1.Image, UBound(PicBits), PicBits(1) 'عكس البايتات For Cnt = 1 To UBound(PicBits) PicBits(Cnt) = 255 - PicBits(Cnt) Next Cnt 'إعادة البايتات الجديدة إلى الصورة SetBitmapBits Picture1.Image, UBound(PicBits), PicBits(1) 'تحديث الصورة Picture1.Refresh End Sub
كود فيجوال بيسك 6
تم تعديل هذه المشاركة بواسطة MoaM في 2 أكتوبر 2005 في 21:18
شكرا MoaM الحقيقية نحن طمعانينبالكود السابق تبع الفلاتر..
شكرا لك ..انا ما بعرف لماذا الناس لا تتفاعل ..أكواد رهيبة
غداً أو بعد غد بإذن الله سأضع شرح الكود السابق (تبع الفلاتر) , و سأضع كود جديد (ليس من برمجتي أيضاً) :lol:
هذا هو شرح الكود
لأي استفسار أنا جاهز
ألا يقراً هذا الموضوع إلى أنا و إياس
شرح الكود :
Private Sub mnuFileOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFileOpen.Click
' إذا تم الضغط على زر "موافق" في مربع حوار فتح الملفات
' يتم متابعة تنفيذ الكود
If dlgOpen.ShowDialog() = DialogResult.OK Then
' إعطاء مربع الصورة قيم الملف الذي تم اختياره
Dim file_bm As New Bitmap(dlgOpen.FileName)
' تعيين قيمتي الطول و العرض
m_OriginalBitmap = New Bitmap(file_bm.Width, file_bm.Height)
' الإعلان عن متغير من الصورة السابقة
Dim gr As Graphics = Graphics.FromImage(m_OriginalBitmap)
' رسم الصورة
gr.DrawImage(file_bm, New Point(0, 0))
' إسناد قيمة الصورة إلى الصورة التالية
picSource.Image = m_OriginalBitmap
' الإعلان عن صورة أخرى
Dim bm As New Bitmap(file_bm.Width, file_bm.Height)
' قيمة المتغير من صورة
gr = Graphics.FromImage(bm)
' إزالة قيمة المتغير و جعل الخلفية هي لون الخلفية الأصلية
gr.Clear(picResult.BackColor)
gr.Dispose()
' صورة مربع الصورة تساوي المتغير
picResult.Image = bm
' نعيين يسار مربع الصورة
picResult.Left = picSource.Size.Width + 2
' تعيين قيمة العرض
Me.Width = picResult.Left + picResult.Width + _
Me.Width - Me.ClientSize.Width
' تعيين قيمة الطول
Me.Height = picResult.Top + picResult.Height + _
Me.Height - Me.ClientSize.Height
file_bm.Dispose()
' تعيين مسار مربع حوار حفظ الملفات إلى مسار مربع حوار فتح الملفات
dlgSave.InitialDirectory = dlgOpen.InitialDirectory
' تشغيل القائمة
mnuFilter.Enabled = True
End If
End Sub
Private Sub mnuFileSaveAs_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFileSaveAs.Click
' إذا تم الضغط على زر "موافق" في مربع حوار حفظ الملفات
If dlgSave.ShowDialog() = DialogResult.OK Then
' الإعلان عن المتغيرات و إسناد قيم لبعضها
Dim bm As Bitmap = DirectCast(picResult.Image.Clone(), Bitmap)
Dim ext As String = dlgSave.FileName
ext = ext.Substring(ext.LastIndexOf("."))
' حفظ الصورة حسب النوع المختار
' BMP أو JPG أو GIF
Select Case ext.ToLower()
Case ".bmp"
bm.Save(dlgSave.FileName, ImageFormat.Bmp)
Case ".gif"
bm.Save(dlgSave.FileName, ImageFormat.Gif)
Case ".jpg", ".jpeg"
bm.Save(dlgSave.FileName, ImageFormat.Jpeg)
End Select
bm.Dispose()
' أيضاً جعل المسار لمربع حوار فتح الملفات هو مسار مربع حوار حفظ الملفات
dlgOpen.InitialDirectory = dlgSave.InitialDirectory
End If
End Sub
' هنا يتم تطبيق الفلتر و إظهار النتيجة
Private Sub ApplyFilter(ByVal filter(,) As Single, Optional ByVal offset_r As Integer = 0, Optional ByVal offset_g As Integer = 0, Optional ByVal offset_b As Integer = 0)
Dim bm As Bitmap = DirectCast(m_OriginalBitmap.Clone(), Bitmap)
' هنا يتم البدء بتطبيق الفلتر
'حيث يتم البدء بالإعلان عن المتغيرات.
Dim y_rank As Integer = filter.GetUpperBound(0) \ 2
Dim x_rank As Integer = filter.GetUpperBound(1) \ 2
Dim r As Integer
Dim g As Integer
Dim b As Integer
' التكرار الرئيسي في تطبيق الفلتر
For py As Integer = y_rank To bm.Height - 1 - y_rank
For px As Integer = x_rank To bm.Width - 1 - x_rank
' حساب قيمة البكسلين
' PX & PY
r = offset_r
g = offset_g
b = offset_b
' بعد أن يتم هذا التكرار
' يتم التأكد من أن القيم صحيحة
' أي تتراوح بين 0 و 255
For fy As Integer = 0 To filter.GetUpperBound(0)
For fx As Integer = 0 To filter.GetUpperBound(1)
With m_OriginalBitmap.GetPixel(px + fx - x_rank, py + fy - y_rank)
r += .R * filter(fx, fy)
g += .G * filter(fx, fy)
b += .B * filter(fx, fy)
End With
Next fx
Next fy
'بعد أن تم حساب قيمة البكسلات يتم إسناد القيم بعد تغييرها
' أقل قيمة يمكن إعطاءها للمتغير هي 0 و أكبر قيمة هي 255
' لذلك إذا كانت أصغر من صفر يتم جعلها صفر
' و إذا كانت أكبر من 255 يتم جعلها 255
' هذا ينطبق على كل من المتغيرات
' R و G و B
If r < 0 Then
r = 0
ElseIf r > 255 Then
r = 255
End If
If g < 0 Then
g = 0
ElseIf g > 255 Then
g = 255
End If
If b < 0 Then
b = 0
ElseIf b > 255 Then
b = 255
End If
bm.SetPixel(px, py, Color.FromArgb(255, r, g, b))
Next px
Next py
' إظهار النتيجة
picResult.Image = bm
End Sub
' تطبيق الفلاتر يتم هنا
' كل الفلاتر هنا نفس المبدأ
' فقط يتم تغيير القيم المررة
' نجد هناك اختلاف بسيط بين القيم المررة
Private Sub mnuFilterEmboss_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterEmboss.Click
Private Sub mnuFilterLowPass1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterLowPass1.Click
Private Sub mnuFilterLowPass2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterLowPass2.Click
Private Sub mnuFilterHighPass1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterHighPass1.Click
Private Sub mnuFilterHighPass2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterHighPass2.Click
Private Sub mnuFilterHighPass3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterHighPass3.Click
Private Sub mnuFilterPrewitt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterPrewitt.Click
Private Sub mnuFilterLaplacian1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterLaplacian1.Click
Private Sub mnuFilterLaplacian2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterLaplacian2.Click
Private Sub mnuFilterLaplacian3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuFilterLaplacian3.Clickما هي تعليقاتكم عن الكود و شرحه ؟؟ :lol:
بصراحة أنا حتى لاآن لم تصح لي فرصة قراءته جيدا ..بس إن شاء الله اليوم
السلام عليكم..
الحقيقة الكود متشربك بعض الشيء..لكن لم توضح لنا المتغيرات هنا :
Private Sub ApplyFilter(ByVal filter(,) As Single, Optional ByVal offset_r As Integer = 0, Optional ByVal offset_g As Integer = 0, Optional ByVal offset_b As Integer = 0)
وفي شيء ما هو الGetUpperBoundو كيف ظهرت مباشرة بعد التعريف..و لماذا اعتمدت هذه الارقام
GetUpperBound(0) \ 2
طيب ما هو المبدأ حتى تتوضح لنا الفكرة أكثر.
شرح الكود من المبرمج الذي برمجه (صديق أجنبي) , فقط قمت بترجمته !!
على كلٍ , ما هي النقطة التي وجدتها غير واضحة في الكود ؟؟ :lol:
السلام على من اتبع الهدى ورحمة الله وبركاته
أخي العزيز : الأخ العزيز العضو neo قام بعمل برنامج ممتاز بلغة vb6 لنفس الفكرة التي تريدها وأكثر بكثير
فهو يستحق أن تتواصل معه
Name : Ahmed H. Alawady
Web Site : Alawady.info
Email : alawady_ahmed@hotmail.com
Tel : +2 012 345 6808
أخي الكريم Ahmed H. Alawady الحقيقية vb6 اختلف كثيرا من حيث هذه الناحية..
بس MoaM أنا حبيت أعرف ما هو المبدأ الذي اعتمده ..حتى عدل الصورة ..مثلا عكس ألوان أو ماذا..
و المتغيرات الأولى و بعدها فواصل شوي صعبة و الله بدنا الكل يتدخل ^.^ lol:
آسف للتأخر <_<
كما ذكرت أن الكود ليس من برمجتي , و الشرح هو ترجمة شرح المبرمج
رابط قد يفيدك جداً لكود شبيه جدا :lol:
و هو أيضاً مشروح :lol:
http://www.codeproject.com/vb/net/colormatrix.asp
ســـــــلام , و كل عام و أنتم بخير :D
و أنت بخير MoaM الحقيقة نحن مقصرين في حقك..
الحقيقة أنا وجدت خطا في الكود الأجنبي و أحاول أن اجد حله من الأجانب في نفس الصفحة..بس حتى الآن نحتاج لمناقشة أوسع بكثير في مبدأ المعالجة ..
و بعدها سننتقل لموضوع الرسم.. MoaM رح يغمى عليه :lol:
شكرا
eias كتب:و بعدها سننتقل لموضوع الرسم.. MoaM رح يغمى عليه :lol:
:D :D
على العكس , الرسم أسهل بكثير من معالجة الصور و عمل فلاتر لها :lol:
تم تعديل هذه المشاركة بواسطة MoaM في 9 أكتوبر 2005 في 15:37
يا رجل تخيل الأجانب عالجوا كل الأخطاء إلا الخطأ الي بدي ياه ^.^
المصفوفة فيها خطأ بالأمر New
السلام عليكم
إخواني بما أنكم محترفين بالتعامل مع الصور فإن شاء الله بلاقي عندكم حل لبعض مشاكلي
أرجو الدخول إلى الروابط التالية :
و شكرا
هذا الموضوع مغلق.
