PixelArray [Counter]: = BoxCurrentLine ^ [HorB] else
PixelArray [Counter]: = 0; p>
Inc (Counter); end; end; p>
// Сортуємо масив 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 p>
Temp: = PixelArray [VertB]; p>
PixelArray [VertB]: = PixelArray [HorB]; p>
PixelArray [HorB]: = Temp; end; end; end; p>
// Беремо те що посередині і присвоюємо поточному пікселю p>
CurrentLine ^ [Hor]: = PixelArray [((Value * Value) div 2) + 1]; end; p>
end; p>
Image1.Visible : = False; p>
Image1.Visible: = True; p>
N4.Enabled: = True; end else p>
MessageBox (Handle, 'Такий формат файлу поки НЕ подорожувати ...', p>
'Слабенько я поки ...', MB_OK or MB_ICONSTOP or
MB_APPLMODAL); end; end; p>
Результат роботи фільтру можна побачити на рис. № 6. P>
p>
Рис. № 6. Початок роботи медіанного фільтру - запит на розмір вікна фільтра. P>
p>
Рис. № 7.Результат роботи медіанного фільтра з вікном 3 на 3. P>
4. Заповнення об'єкта іншим кольором. P>
Для спрощення алгоритму слудующая процедура заповнює графічніоб'єкти тільки білим кольором, однак шляхом простого додавання діалоговоговікна з питанням про колір заповнення можна домогтися заповнення об'єктів будь-якимкольором. p>
procedure TMainForm.Image1MouseDown (Sender: TObject; Button:
TMouseButton; p>
Shift: TShiftState; X, Y: Integer); var p>
TargetPixel: Byte; p>
ChangeCount: Integer; p>
CurrentLine: pByteArray; p>
PrevLine: pByteArray; p>
NextLine: pByteArray; p>
YOffset, XOffset: Integer; begin if Image1.Picture.Bitmap.PixelFormat = pf8bit then begin p>
// Запам'ятовуємо значення пікселя на якому клацнули мишкою p>
TargetPixel: = pByteArray (Image1.Picture.Bitmap.ScanLine [Y]) ^ [X]; p>
YOffset: = 0; p>
// Поки кількість замін не стане рівним 0 рухаємося вгору repeat p>
ChangeCount: = 0; p>
if Y - YOffset <0 then p>
Break; p>
// Беремо лінію p>
CurrentLine: = Image1.Picture.Bitmap.ScanLine [Y - YOffset]; p>
PrevLine: = Image1.Picture.Bitmap.ScanLine [Y - YOffset - 1]; if PrevLine [X] TargetPixel then p>
Break; p>
XOffset: = 0;
// Заповнюємо вліво її поки не дійдемо до кордону об'єкта if X - 1> = 0 then while CurrentLine ^ [X - XOffset - 1] = TargetPixel do begin p>
CurrentLine ^ [X - XOffset]: = 255; p>
Inc (XOffset); p>
Inc (ChangeCount); if X - XOffset - 1 <0 then p>
Break; end ; p>
XOffset: = 0; p>
// Заповнюємо вправо її поки не дійдемо до кордону об'єкта if X + 1 CurrentLine ^ [X + XOffset]: = 255; p>
Inc (XOffset); p>
Inc (ChangeCount ); if X + XOffset + 1> Image1.Picture.Bitmap.Width - 1 then p>
Break; end; p>
Inc (YOffset); until ChangeCount = 0; p >
YOffset: = 1; p>
// Поки кількість замін не стане рівним 0 рухаємося вниз repeat p>
ChangeCount: = 0; p>
if Y + YOffset> Image1.Picture.Bitmap.Width - 1 then p>
Break; p>
// Беремо лінію p>
CurrentLine: = Image1.Picture.Bitmap.ScanLine [ Y + YOffset]; p>
NextLine: = Image1.Picture.Bitmap.ScanLine [Y + YOffset + 1]; if NextLine [X] TargetPixel then p>
Break; p>
XOffset: = 0; p>
// Заповнюємо вліво її поки не дійдемо до кордону об'єкта if X - 1> = 0 then while CurrentLine ^ [X - XOffset - 1] = TargetPixel do begin p>
CurrentLine ^ [X - XOffset]: = 255; p>
Inc (XOffset); p>
Inc (ChangeCount); if X - XOffset - 1 <0 then
Break; end; p>
XOffset: = 0; p>
// Заповнюємо вправо її поки не дійдемо до кордону об'єкта if X + 1 CurrentLine ^ [X + XOffset]: = 255; p>
Inc (XOffset);
Inc (ChangeCount); if X + XOffset + 1> Image1.Picture.Bitmap.Width - 1 then p>
Break; end; p>
Inc (YOffset) ; until ChangeCount = 0; p>
Image1.Visible: = False; p>
Image1.Visible: = True; end; end; p>
Результати роботи програми можна побачити на рис. № 8 і № 9. P>
p>
Рис. № 8. Початкове зображення для заповнення. P>
p>
Рис. № 9. Результат заповнення. P>
5. Інверсія. P>
Ну і наприкінці зробимо інверсію нашого зображення (Рис. 10, 11): p>
procedure TMainForm.N7Click (Sender: TObject); var p>
Line : pByteArray; p>
I, J: Integer; p>
Bits: Byte; begin p>
Bits: = 1; for I: = 0 to Image1.Picture. Bitmap.Height - 1 do begin p>
Line: = Image1.Picture.Bitmap.ScanLine [I]; p>
case Image1.Picture.Bitmap.PixelFormat of pf4bit: Bits: = 1 ; pf8bit: Bits: = 1; pf15bit: Bits: = 2; pf16bit: Bits: = 2; pf24bit: Bits: = 3; pf32bit: Bits: = 4; end; p>
for J: = 0 to Image1.Picture.Bitmap.Width * Bits - 1 do p>
Line ^ [J]: = 255 - Line ^ [J]; p>
end; p>
Image1.Visible: = False; p>
Image1.Visible: = True; p>
N4.Enabled: = True; end; p>
p> < p> Рис. № 10. Початкове зображення для інверсії. P>
p>
Рис. № 11. Результат інверсії зображення. P>
p>