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

نقاش : للتعديل على الصور

مغلق
بدأه eias في 4 سبتمبر 2005 · 45 رد · 3,275 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#27
eias كتب:
الفلتر الأول يلغي الثاني  عند تطبيقه على الصورة

آسف على التأخر,

بالنسبة لتطبيق الفلتر الثاني على الصورة بعد تطبيق الفلتر الأول , يمكن القيام بذلك بإضافة هذا الكود إلى الـ ApplyFilter

Sub و يجب إضافة هذا الكود تماماً قبل الجملة End Sub و أما الكود فهو

m_OriginalBitmap = picResult.Image

انظر إلى هذه البساطة !!

سلام :lol:

#28

يا سلام عليك يا MoaM فعلا الطريقة صحيحة ...(بس ماناوي تعمل لنا توضيح بسيط عن الكود ^.^ ^.^)

يا جماعة لماذا انتم ساكتون هكذا..هيا انهالوا على MoaM شكرا

#29
eias كتب:
بس ماناوي تعمل لنا توضيح بسيط عن الكود

قريباً إن شاء الله , و لكن أتت المدرسة و ... أفففف :(

بالمناسبة , يجب أن نضع بعض أمثلة أخرى (ليس وعد) و يصبح الموضوع جديراً بالتثبيت :lol:

تم تعديل هذه المشاركة بواسطة MoaM في 19 سبتمبر 2005 في 13:15

#31

كود بسيط جداً لتنشيط الموضوع قليلاً <_< ,

عكس ألوان الصورة بالاعتماد على دوال الـ 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

#32

شكرا MoaM الحقيقية نحن طمعانينبالكود السابق تبع الفلاتر..

شكرا لك ..انا ما بعرف لماذا الناس لا تتفاعل ..أكواد رهيبة

#34

هذا هو شرح الكود

لأي استفسار أنا جاهز

ألا يقراً هذا الموضوع إلى أنا و إياس

شرح الكود :

    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
#38

السلام عليكم..

الحقيقة الكود متشربك بعض الشيء..لكن لم توضح لنا المتغيرات هنا :

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

طيب ما هو المبدأ حتى تتوضح لنا الفكرة أكثر.

#40

السلام على من اتبع الهدى ورحمة الله وبركاته

أخي العزيز : الأخ العزيز العضو neo قام بعمل برنامج ممتاز بلغة vb6 لنفس الفكرة التي تريدها وأكثر بكثير

فهو يستحق أن تتواصل معه

Name : Ahmed H. Alawady

Web Site : Alawady.info

Email : alawady_ahmed@hotmail.com

Tel : +2 012 345 6808

#41

أخي الكريم Ahmed H. Alawady الحقيقية vb6 اختلف كثيرا من حيث هذه الناحية..

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

و المتغيرات الأولى و بعدها فواصل شوي صعبة و الله بدنا الكل يتدخل ^.^ lol:

#42

آسف للتأخر <_<

كما ذكرت أن الكود ليس من برمجتي , و الشرح هو ترجمة شرح المبرمج

رابط قد يفيدك جداً لكود شبيه جدا :lol:

و هو أيضاً مشروح :lol:

http://www.codeproject.com/vb/net/colormatrix.asp

ســـــــلام , و كل عام و أنتم بخير :D

#43

و أنت بخير MoaM الحقيقة نحن مقصرين في حقك..

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

و بعدها سننتقل لموضوع الرسم.. MoaM رح يغمى عليه :lol:

شكرا

#44
eias كتب:
و بعدها سننتقل لموضوع الرسم..   MoaM رح يغمى عليه  :lol:

:D :D

على العكس , الرسم أسهل بكثير من معالجة الصور و عمل فلاتر لها :lol:

تم تعديل هذه المشاركة بواسطة MoaM في 9 أكتوبر 2005 في 15:37

#46

السلام عليكم

إخواني بما أنكم محترفين بالتعامل مع الصور فإن شاء الله بلاقي عندكم حل لبعض مشاكلي

أرجو الدخول إلى الروابط التالية :

/index.php?showtopic=101891

/index.php?showtopic=101894

و شكرا

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

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