السلام عليكم
أرجو من جميع الأعضاء المساعدة
أريد قراءة أي بيكسل في صورة حيث بتم إرجاع لون البيكسل المحدد (RGB)
السلام عليكم
أرجو من جميع الأعضاء المساعدة
أريد قراءة أي بيكسل في صورة حيث بتم إرجاع لون البيكسل المحدد (RGB)
تم تعديل هذه المشاركة بواسطة majed-4u في 9 مارس 2005 في 13:34
Bitmap img=new Bitmap("Path Here");
Color FirstPixelColor=img.GetPixel(0,0);ممكن تغير ال 0,0 لأى x,y فى الصورة

<marquee>
مش موجود بصفة دايمة للامتحانات
</marquee>
شكرا أخي المشرف ahabdeen علي الرد السريع
ولكن عند إدخال الصورة كاملة في 2dim-array
كل عنصر يعبر عن Color فإن العملية تأخذ وقت كبير
هل يوجد دالة أسرع من img.GetPixel
وأكرر شكري لأخي ahabdeen
ممكن تستخدم ال Unsafe methods اسرع بكتير بس مش ضمن ال GC Control

<marquee>
مش موجود بصفة دايمة للامتحانات
</marquee>
'يحمل هذا المتغير الصورة الموجودة في مربع الصورة 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
ب ال 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();
<marquee>
مش موجود بصفة دايمة للامتحانات
</marquee>
السلام عليكم
شكرا أخي إسماعيل عنجريني علي الرد .
وأشكر اخي ahabdeen علي هذا الكود و بالفعل فإن السرعة إرتفعت 4
أضعاف الطريقة السابقة
وأكرر شكري لأخي ahabdeen
السلام عليكم
كيف يمكنني أن أستغل Winapi32
للحصول علي صورة من Camira وأضعها ك Image
هذا الموضوع مغلق.