Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Изменение контрастности изображения

Delphi , Графика и Игры , Bitmap



Автор: Fenik
WEB-сайт: http://delphibase.endimus.com

{ **** 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 для коррекции контраста изображения принимает три параметра: Bitmap (изображение, которое будет изменено), Value (значение между -100 и 100, определяющее уровень коррекции контраста) и Local (логическое флаг, указывающее, является ли коррекция контраста "локальной" или "глобальной").

Вот шаг за шагом, что код делает:

  1. Программа проверяет, равно ли значение параметра Value нулю. Если это так, функция выходит без изменения изображения.
  2. Она рассчитывает ширину и высоту изображения.
  3. Если Local истинно, она устанавливает средние значения красного, зеленого и синего цветов (mR, mG и mB) в 128. Это означает, что локальная коррекция контраста будет применяться на основе этих средних значений.
  4. Если Local ложно, она рассчитывает средние значения красного, зеленого и синего цветов всей картинки, перебирая каждый пиксель и суммируя значения. Затем она делит это сумму на общее количество пикселей, чтобы получить среднее значение для каждого канала цвета.
  5. Программа затем применяет формулу коррекции контраста к каждому пикселю изображения в зависимости от параметра Value. Если Value положительно, она увеличивает яркость изображения; если Value отрицательно, она уменьшает яркость.
  6. Аjusted значения ограничиваются диапазоном 0-255 с помощью функции BLimit.

Метод локальной коррекции контраста перебирает каждый пиксель в изображении и изменяет его цветовые значения на основе средних значений, рассчитанных ранее. Это означает, что пиксели с цветовыми значениями, близкими к средним, будут изменяться меньше, чем те, которые farther away от средних.

В целом, эта программа предоставляет способ коррекции контраста изображения с помощью либо локальных, либо глобальных методов, в зависимости от значения параметра Local.

Вот некоторые предложения и улучшения:

  • Код может выгодно использовать более комментариев и документации для объяснения каждого раздела.
  • Обработка ошибок минимальна; рекомендуется добавить проверки на недопустимые значения параметров (например, нецелочисленное Value) и потенциальные runtime-ошибки (например, доступ к изображению, которое слишком большое).
  • Программа предполагает Windows-среду, но может быть полезно добавить платформонезависимый код или сделать зависимости более явными.
  • Рекомендуется добавить болееadvanced методы коррекции контраста, такие как равномерное распределение или коррекция гаммы, для большей гибкости.

Код также может быть улучшен с точки зрения организации и читаемости, разбивая его на меньшие функции или процедуры, которые выполняют конкретные задачи. Это сделает код более понятным и поддерживаемым.

В статье описана процедура изменения контрастности изображения в Delphi, которая позволяет изменять контрастность на отрезке [-100..100] и выбирать между локальным и общим способом изменения контрастности.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Bitmap ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 13:10:11/0.0034220218658447/0