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

إستعلام عن الصور

مغلق
بدأه majed-4u في 9 مارس 2005 · 7 رد · 799 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أرجو من جميع الأعضاء المساعدة

أريد قراءة أي بيكسل في صورة حيث بتم إرجاع لون البيكسل المحدد (RGB)

تم تعديل هذه المشاركة بواسطة majed-4u في 9 مارس 2005 في 13:34

#2
Bitmap img=new Bitmap("Path Here");
Color FirstPixelColor=img.GetPixel(0,0);

ممكن تغير ال 0,0 لأى x,y فى الصورة

ahabdeen.jpg

<marquee>

مش موجود بصفة دايمة للامتحانات

</marquee>

#3

شكرا أخي المشرف ahabdeen علي الرد السريع

ولكن عند إدخال الصورة كاملة في 2dim-array

كل عنصر يعبر عن Color فإن العملية تأخذ وقت كبير

هل يوجد دالة أسرع من img.GetPixel

وأكرر شكري لأخي ahabdeen

#4

ممكن تستخدم ال Unsafe methods اسرع بكتير بس مش ضمن ال GC Control

ahabdeen.jpg

<marquee>

مش موجود بصفة دايمة للامتحانات

</marquee>

#5
       'يحمل هذا المتغير الصورة الموجودة في مربع الصورة
       Dim Bitmap As Bitmap = New Bitmap(PictureBox1.Image)
      'انشاء مستطيل بنفس مساحة الصورة
       Dim Rect As New Rectangle(0, 0, Bitmap.Width, Bitmap.Height)
       'يحمل هذا المتغير بيانات عن صورة معينة
       Dim BitmapData As BitmapData = New BitmapData()
       'تقوم هذه الدالة باغلاق مساحة معينة من الصورة ولها 3 توابع
       'الاول : المساحة التي تريد اغلاقها من الصورة ليتم التعامل معها في الذاكرة مباشرة
       'الثاني : نوع الاغلاق و قد اخترنا منع الكتابة على الصورة
       'الثالث : تحديد نوع تنسيق الصورة و قد اخترنا النقطية
       'و بالتالي اصبح هذا المتغير يشير الى بيانات الصورة في الذاكرة 
       BitmapData = Bitmap.LockBits(Rect, ImageLockMode.WriteOnly, _
                Bitmap.PixelFormat)
       'عرفنا هذا المتغير من نوع المؤشرات
       Dim pixels As IntPtr
       'تقوم هذه الدالة باعطائك العنوان لاول نقطة في الصورة في الذاكرة
       pixels = BitmapData.Scan0()
       'يمنحك هذا الكلاس مجموعة من الدوال تمكنك من القراءة و الكتابة في الذاكرة
       Dim M As System.Runtime.InteropServices.Marshal
       Dim X, Y, C, O As Integer
       Dim W As Integer = Rect.Width
       Dim Clr As Color
       For Y = 0 To Rect.Height  -1
           For X = 0 To W - 1
               ' حساب موضع النقطة في الذاكرة
               ' موضع النقطة هو : 4 * عرض الصورة * رقم الصف الذي به النقطة + 4 * رقم العمود الذي به النقطة
               ' لاحظ ان الرقم 4 هو بسبب ان الصورة نقطية و ان كل نقطة في الذاكرة تخزن في اربع وحدات في الذاكرة
               O = CInt((4 * W * Y) + (4 * X))
               'تقوم هذه الدالة بقراءة بيانات معينة من الذاكرة
               '  اتابع الاول: العنوان الذي يشير الى الصورة في الذاكرة
               'التابع الثاني : عدد الوحدات التي تريد ان يتم اضافتها الى العنوان الاساسي للصورة ليتم قراءة البيانات التي به 
               C = M.ReadInt32(pixels, O)
               ' تحويل اللون من عدد صحيح إلى كائن لون
               Clr = Color.FromArgb(C)
               ' عكس الوان الصورة
               Clr = Color.FromArgb(Clr.A, 255 - Clr.R, _
               255 - Clr.G, 255 - Clr.B)
               ' تحويل كائن اللون إلى عدد صحيح
               C = Clr.ToArgb
               ' تخزين اللون المعكوس في الذاكرة
               'التابع الثالث لهذه الدالة هو البينات التي تريد كتابتها في العنوان المحدد
               M.WriteInt32(pixels, O, C)
           Next
       Next
       ' فك الاغلاق الذي تم في الذاكرة للصورة
       Bitmap.UnlockBits(BitmapData)
       PictureBox1.Image = Bitmap
       PictureBox1.Refresh()
   End Sub
End Class

-> Height -1

تم تعديل هذه المشاركة بواسطة ahabdeen في 15 مارس 2005 في 18:43

#6

ب ال c#

 Rectangle rectangle1;
      Bitmap bitmap1 = new Bitmap(this.PictureBox1.Image);
      rectangle1 = new Rectangle(0, 0, bitmap1.Width, bitmap1.Height);
      BitmapData data1 = new BitmapData();
      data1 = bitmap1.LockBits(rectangle1, ImageLockMode.WriteOnly, bitmap1.PixelFormat);
      IntPtr ptr1 = data1.Scan0;
      int num3 = rectangle1.Width;
      int num7 = rectangle1.Height - 1;
      for (int num5 = 0; num5 <= num7; num5++)
      {
            int num6 = num3 - 1;
            for (int num4 = 0; num4 <= num6; num4++)
            {
                  int num2 = ((4 * num3) * num5) + (4 * num4);
                  int num1 = Marshal.ReadInt32(ptr1, num2);
                  Color color1 = Color.FromArgb(num1);
                  color1 = Color.FromArgb(color1.A, 0xff - color1.R, 0xff - color1.G, 0xff - color1.B);
                  num1 = color1.ToArgb();
                  Marshal.WriteInt32(ptr1, num2, num1);
            }
      }
      bitmap1.UnlockBits(data1);
      this.PictureBox1.Image = bitmap1;
      this.PictureBox1.Refresh();

ahabdeen.jpg

<marquee>

مش موجود بصفة دايمة للامتحانات

</marquee>

#7

السلام عليكم

شكرا أخي إسماعيل عنجريني علي الرد .

وأشكر اخي ahabdeen علي هذا الكود و بالفعل فإن السرعة إرتفعت 4

أضعاف الطريقة السابقة

وأكرر شكري لأخي ahabdeen

#8

السلام عليكم

كيف يمكنني أن أستغل Winapi32

للحصول علي صورة من Camira وأضعها ك Image

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

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