unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ExtDlgs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Button3: TButton;
    Edit1: TEdit;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    Button4: TButton;
    Image3: TImage;
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var prog_bin,k,x,y,wys,szer:integer;
begin
 prog_bin:=StrToIntDef(Edit1.Text,128);
 Wys:=Image1.Picture.Bitmap.Height;
 Szer:=Image1.Picture.Bitmap.Width;

 Image2.Picture.Bitmap.Height:=Wys;
 Image2.Picture.Bitmap.Width:=Szer;

 //binaryzacja i przepisanie do Image2
  for X:=0 to Szer-1 do
    for Y:=0 to Wys-1 do
     begin
       k:=Image1.Picture.Bitmap.Canvas.Pixels[X,Y];
       k:=k mod 256;
       if (k>=prog_bin) then k:=255 else k:=0;  //progowanie
 Image2.Picture.Bitmap.Canvas.Pixels[X,Y]:= RGB(k,k,k);
     end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   if OpenPictureDialog1.Execute then
   Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 if SavePictureDialog1.Execute then
    Image2.Picture.SaveToFile(SavePictureDialog1.FileName);

end;

procedure TForm1.Button4Click(Sender: TObject);
var x,y,wys,szer:integer;
    k24: TColor;
    k8,r,b,g,prog_bin: byte;
begin
 prog_bin:=StrToIntDef(Edit1.Text,128);
 Wys:=Image1.Picture.Bitmap.Height;
 Szer:=Image1.Picture.Bitmap.Width;

 Image3.Picture.Bitmap.Height:=Wys;
 Image3.Picture.Bitmap.Width:=Szer;

 //binaryzacja i przepisanie do Image2
 for X:=0 to Szer-1 do
   for Y:=0 to Wys-1 do
     begin
       k24:=Image1.Picture.Bitmap.Canvas.Pixels[X,Y];
    //obliczenie wartości składowych koloru RGB
       r:=GetRValue(k24); //składowa Red - czerwony
       g:=GetGValue(k24); //składowa Green - zielony
       b:=GetBValue(k24); //składowa Blue - niebieski
       //zamiana koloru ze składowych RGB na jeden kolor
        k8:=Round((r+b+g)/3); //1 sposób
       //k8:=Round(0.299*r+0.587*b+0.114*g);  //2 sposób
       //k8:=Round((r+b)div 2+g) div 2;  //3 sposób

       //można nie binaryzować obrazu tylko
       //wyświetlić go w odcieniach szarości
       // Image2.Picture.Bitmap.Canvas.Pixels[X,Y]:= RGB(k8,k8,k8);

  //lub wyświetlić po binaryzacji (progowaniu)
  if (k8>=prog_bin) then k8:=255 else k8:=0;  //progowanie
   Image3.Picture.Bitmap.Canvas.Pixels[X,Y]:= RGB(k8,k8,k8);
     end;

end;

end.
