delphi4arab منتديات دلفي للعرب
لمحة عن التعامل مع الصور - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (http://delphi4arab.net/forum)
+-- قسم : منتديات دلفي التقنية (http://delphi4arab.net/forum/forumdisplay.php?fid=6)
+--- قسم : دلفي والتعامل مع الرسوميات وبرمجة الألعاب (http://delphi4arab.net/forum/forumdisplay.php?fid=19)
+--- الموضوع : لمحة عن التعامل مع الصور (/showthread.php?tid=1212)



لمحة عن التعامل مع الصور - MjIrIm - 16-09-2009

في البداية السلام عليكم


بالمرفقات تطبيق به بعض الدوال و الأكواد لمن يريد أخذ فكرة أولية على
Digital Image Processing

لمحة:
إقتباس :تعتبر الصورة مجموهة من Pixels
و كل Pixel تأخذ قيمة بين 0 و 255
أي بين اللون الأبيض و صولا الى الأسود
المجال بين القيمتين يمثل مجوعة الألوان الأخرى بمختلف أشكالها

نأتي الان الى الصور من ناحية النوعية
حيث هناك عدة أنواع من الصور منها BitMap Images
وهي التي يستعملها الجميع في الحياة اليومية
(الموجود في الهاتف الجوال و الجرائد و المصورة و التي بجهاز الحاسوب)
لكن منها ما هو ثنائي الأبعاد و منها ما هو ثلاثي الأبعاد

بصفة عامة من ناحية الألوان الصورة يمكن أن تكون:
تحمل لونين فقط أي أبيض أو أسود
تحمل مجموعة من الألوان و تكون الألوان في المجال الذي ذكرته سابقا أي بين 0 و 255

بالنسبة الى الصور بالألوان يتم دراستها مقارنة بثلاثة ألوان وهم
الأحمر Red
الأخضر Green
الأزرق Blue
و ذلك نظرا لكون كل لون هو خليط من لونين فأكثر و هذه الألون هي مصدر كل شيء
و لكون العين تحتاجها لتمييز بعض الأشياء منها الطبيعة أي اللون الأخضر
السماء اللون الأزرق و أشعة الشمس اللون الأحمر



[صورة مرفقة: dipimg01.png]

{Function To Take a ScreenShot Of The Desktop}
أخذ صورة لسطح المكتب

كود :
function GetScreenShot: TBitmap;
var
  Desktop: HDC;
begin
  Result  := TBitmap.Create;
  Desktop := GetDC(0);
  try
    try
      Result.PixelFormat := pf32bit;
      Result.Width := Screen.Width;
      Result.Height := Screen.Height;
      BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, Desktop, 0, 0, SRCCOPY);
      Result.Modified := True;
    finally
      ReleaseDC(0, Desktop);
    end;
  except
    Result.Free;
    Result := nil;
  end;
end;

عملية الاستدعاء كالاتي:
كود :
procedure TForm1.ScrShotBtnClick(Sender: TObject);
begin
  Image1.Picture.Bitmap:= GetScreenShot;
end;

{Procedure To Take a ScreenShot Of An Active Window}
أخذ صورة للنافذة الحية في سطح المكتب

كود :
procedure ScreenShotActiveWindow(Bild: TBitMap; Val: Boolean);
var
  c: TCanvas;
  r, t: TRect;
  h: THandle;
begin
    c := TCanvas.Create;
    c.Handle := GetWindowDC(GetDesktopWindow);
    h := GetForeGroundWindow;
    if h <> 0 then
      GetWindowRect(h, t);
    try
      r := Rect(0, 0, t.Right - t.Left, t.Bottom - t.Top);
      Bild.Width  := t.Right - t.Left;
      Bild.Height := t.Bottom - t.Top;
      Bild.Canvas.CopyRect(r, c, t);
    finally
      ReleaseDC(0, c.Handle);
      c.Free;
    end;
end;

عملية الاستدعاء كالاتي:
كود :
procedure TForm1.WinCapBtnClick(Sender: TObject);
begin
  ScreenShotActiveWindow(Image1.Picture.BitMap, Ok);
end;

{ ***** Image without Blue Color ***** }
الحصول على صورة بدون الاعتماد على اللون الأزرق

كود :
procedure TForm1.ImgWBBtnClick(Sender: TObject);
var
  Z,X,bX,Y : Integer;
  Ligne : PByteArray;
begin
  for Z := 0 to  Form1.Image1.Picture.Bitmap.Width - 1  do begin
    for Y := 0 to Form1.Image1.Picture.Bitmap.Height - 1 do begin
      Ligne := Image1.Picture.Bitmap.ScanLine[Y];
      for X := 0 to Form1.Image1.Picture.Bitmap.Width -1 do begin
        bX := X * 3;
        Ligne[bX] := (Ligne[bX+3]);
      end;
    end;
    Form1.Image1.Repaint;
  end;
end;

{ ***** Image without Green Color ***** }
الحصول على صورة بدون الاعتماد على اللون الأخضر

كود :
procedure TForm1.ImgWGBtnClick(Sender: TObject);
var
  Z,X,bX,Y : Integer;
  Ligne : PByteArray;
begin
  for Z := 0 to  Form1.Image1.Picture.Bitmap.Width - 1  do begin
    for Y := 0 to Form1.Image1.Picture.Bitmap.Height - 1 do begin
      Ligne := Image1.Picture.Bitmap.ScanLine[Y];
      for X := 1 to Form1.Image1.Picture.Bitmap.Width do begin
        bX := X * 3;
        if X = Form1.Image1.Picture.Bitmap.Width then
          Ligne[bX-2] := 0
        else
          Ligne[bX-2] := (Ligne[bX+1]);
      end;
    end;
    Form1.Image1.Repaint;
  end;
end;

{ ***** Image without Red Color ***** }
الحصول على صورة بدون الاعتماد على اللون الأحمر

كود :
procedure TForm1.ImgWRBtnClick(Sender: TObject);
var
  X,Y, bX : Integer;
  Ligne : PByteArray;
begin
  for Y := 0 to Form1.Image1.Picture.Bitmap.Height -1 do begin
    Ligne := Form1.Image1.Picture.Bitmap.ScanLine[Y];
    for X := 0 to Form1.Image1.Picture.Bitmap.Width -1 do begin
       bX := X * 3;
       Ligne[bX+2] := 0;
    end;
    Form1.Image1.Repaint;
  end;
end
;

{ ***** Obtain Flow Image ***** }
الحصول على صورة مشوشة

كود :
procedure TForm1.ImgFlowBtnClick(Sender: TObject);
var
  Z,X,bX,Y : Integer;
  Ligne : PByteArray;
begin
for Z := 0 to 3 do Begin
  for Y := 0 to Form1.Image1.Picture.Bitmap.Height -1 do begin
    Ligne := Image1.Picture.Bitmap.ScanLine[Y];
    for X := 1 to Form1.Image1.Picture.Bitmap.Width -1 do Begin
       bX := X * 3;
       Ligne[bX+2] := (Ligne[bX+2]+Ligne[bX-1] ) Div 2;
       Ligne[bX+1] := (Ligne[bX+1]+Ligne[bX-2]) Div 2;
       Ligne[bX] := (Ligne[bX]+Ligne[bX-3]) Div 2;
    end;
  end;
  Form1.Image1.Repaint;
end;
end;

[صورة مرفقة: dipimg02.png]

[صورة مرفقة: dipimg03.png]

لمن يريد التعامل مع الصور يستحن أن يستعمل صور بصيغة *.bmp
تم ارفاق صورة لمن يريد التجربة مع الملفات

بالتوفيق للجميع
و السلام.



لمحة عن التعامل مع الصور - TF6M - 16-09-2009

بارك الله فيك MjIrIm جميل جدا .
لو إستعنت بصورة قوس قزح لأخذ قيم اللون بمجرد مرور المؤشر عليه
لتضيفه كخيار لفلترة الصورة .. مجرد فكرة .
بالتوفيق ,,