![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Изменение контрастности изображенияDelphi , Графика и Игры , Bitmap
Автор: Fenik { **** UBPFD *********** by delphibase.endimus.com **** >> Value - значение контрастности на отрезке [-100..100] Local - если True, то применяется "местный контраст", если False, то - "общий" (более красивый) Зависимости: Windows Автор: Fenik, chook_nu@uraltc.ru, Новоуральск Copyright: Николай Федоровских Дата: 14 июля 2003 г. ***************************************************** } procedure Contrast(Bitmap: TBitmap; Value: Integer; Local: Boolean); function BLimit(B: Integer): Byte; begin if B < 0 then Result := 0 else if B > 255 then Result := 255 else Result := B; end; var Dest: pRGBTriple; x, y, mr, mg, mb, W, H, tr, tg, tb: Integer; vd: Double; begin if Value = 0 then Exit; W := Bitmap.Width - 1; H := Bitmap.Height - 1; if Local then begin mR := 128; mG := 128; mB := 128; end else begin tr := 0; tg := 0; tb := 0; for y := 0 to H do begin Dest := Bitmap.ScanLine[y]; for x := 0 to W do begin with Dest^ do begin Inc(tb, rgbtBlue); Inc(tg, rgbtGreen); Inc(tr, rgbtRed); end; Inc(Dest); end; end; mB := Trunc(tb / (W * H)); mG := Trunc(tg / (W * H)); mR := Trunc(tr / (W * H)); end; if Value > 0 then vd := 1 + (Value / 10) else vd := 1 - (Sqrt(-Value) / 10); for y := 0 to H do begin Dest := Bitmap.ScanLine[y]; for x := 0 to W do begin with Dest^ do begin rgbtBlue := BLimit(mB + Trunc((rgbtBlue - mB) * vd)); rgbtGreen := BLimit(mG + Trunc((rgbtGreen - mG) * vd)); rgbtRed := BLimit(mR + Trunc((rgbtRed - mR) * vd)); end; Inc(Dest); end; end; end; Программа на Delphi для коррекции контраста изображения принимает три параметра: Вот шаг за шагом, что код делает:
Метод локальной коррекции контраста перебирает каждый пиксель в изображении и изменяет его цветовые значения на основе средних значений, рассчитанных ранее. Это означает, что пиксели с цветовыми значениями, близкими к средним, будут изменяться меньше, чем те, которые farther away от средних. В целом, эта программа предоставляет способ коррекции контраста изображения с помощью либо локальных, либо глобальных методов, в зависимости от значения параметра Вот некоторые предложения и улучшения:
Код также может быть улучшен с точки зрения организации и читаемости, разбивая его на меньшие функции или процедуры, которые выполняют конкретные задачи. Это сделает код более понятным и поддерживаемым. В статье описана процедура изменения контрастности изображения в Delphi, которая позволяет изменять контрастность на отрезке [-100..100] и выбирать между локальным и общим способом изменения контрастности. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |