Вот код моего фильтра: | Код | unit Median;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Button2: TButton; OpenPictureDialog1: TOpenPictureDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; iw,ih: integer; // первоначальный размер компонента Image implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end;
procedure Scalelmage; var
pw, ph : integer; // размер иллюстрации scaleX, scaleY : real; // масштаб по Х и Y scale : real; // общий масштаб
begin // иллюстрация уже загружена // получим ее размеры
pw := Form1.Image1.Picture.Width; ph := Form1.Image1.Picture.Height;
if pw > iw // ширина иллюстрации больше ширины компонента Image then scaleX := iw/pw // нужно масштабировать else scaleX := 1; if ph > ih // высота иллюстрации больше высоты компонента then scaleY := ih/ph // нужно масштабировать else scaleY := 1;
// выберем наименьший коэффициент if scaleX < scaleY then scale := scaleX else scale := scaleY;
// изменим размер области вывода иллюстрации Form1.Image1.Height := Round(Form1.Image1.Picture.Height*scale); Form1.Image1.Width := Round(Form1.Image1.Picture.Width*scale);
// т. к. Strech = True и размер области пропорционален // размеру картинки, то картинка масштабируется без искажений
end; procedure TForm1.Button2Click(Sender: TObject); var PixelArray:array of Byte; Value:Byte; CurrentLine:pByteArray; BoxCurrentLine:pByteArray; Vert,Hor:Integer; VertB,HorB:Integer; Counter:Integer; Temp:Byte; begin ValueForm.Caption := 'Размер окна фильтра n X n'; ValueForm.TrackBar1.Min := 3; ValueForm.TrackBar1.Max := 9; ValueForm.TrackBar1.Frequency := 2; if ValueForm.Execute(Value) then begin SetLength(PixelArray,Value*Value);
if Image1.Picture.Bitmap.PixelFormat = pf8bit then begin for Vert := 0 to Image1.Picture.Bitmap.Height - 1 do begin CurrentLine := Image1.Picture.Bitmap.ScanLine[Vert];
for Hor := 0 to Image1.Picture.Bitmap.Width - 1 do begin
// Заносим все пиксели окошка в массив Counter := 0; for VertB := (Vert - (Value div 2)) to (Vert + (Value div 2)) do begin if (VertB >= 0) and (VertB < Image1.Picture.Bitmap.Height) then BoxCurrentLine := Image1.Picture.Bitmap.ScanLine[VertB];
for HorB := (Hor - (Value div 2)) to (Hor + (Value div 2)) do begin
if (HorB >= 0) and (VertB >= 0) and (HorB < Image1.Picture.Bitmap.Width) and (VertB < Image1.Picture.Bitmap.Height) then PixelArray[Counter] := BoxCurrentLine^[HorB] else PixelArray[Counter] := 0;
Inc(Counter); end; end;
// Сортируем массив for VertB := 0 to Value*Value - 1 do begin for HorB := VertB to Value*Value - 1 do begin if PixelArray[VertB] > PixelArray[HorB] then begin Temp := PixelArray[VertB]; PixelArray[VertB] := PixelArray[HorB]; PixelArray[HorB] := Temp; end; end; end;
// Берем то что посередине и присваиваем текущему пикселю CurrentLine^[Hor] := PixelArray[((Value*Value) div 2) + 1]; end;
end;
Image1.Visible := False; Image1.Visible := True; end else MessageBox(Handle,'Такой формат файла пока не подерживается', 'Message',MB_OK or MB_ICONSTOP or MB_APPLMODAL); end; end;
end.
|
При компиляции один варнинг, на счёт инициализации переменной BoxCurrentLine.А так всё работает.Но вот результат мне чё-то не нравится.Какой-то слишком уж мощно он фильтрует. Вылил RAR, там исходник с EXE и pictures.Гляньте кто-нибудь.
Присоединённый файл ( Кол-во скачиваний: 56 )
_____.rar 201,42 Kb
|