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

Изменить цветовые каналы битового изображения

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

Изменить цветовые каналы битового изображения

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 Mit dem folgenden Code kann die Werte der einzelnen Farbkanale 
 (Rot, Grun, Blau) verandern. 
 So lassen sich leicht fantastische Effekte erzielen. 

 Parameter: 
   - Bitmap: TBitmap 
      Erwartet ein TBitmap auf dem die Anderungen 
      vollzogen werden sollen. 

   - Red: Integer 
      Erwartet einen Integer der den neuen Farbwert bestimmt. 
      Der Wert wird zu dem alten Farbwert addiert. 
      Betragt der Wert 0, wird keine Anderung am Farbkanal 
      vorgenommen. 

    - Green: Integer; 
       Erwartet einen Integer der den neuen Farbwert bestimmt. 
       Der Wert wird zu dem alten Farbwert addiert. 
       Betragt der Wert 0, wird keine Anderung am Farbkanal 
       vorgenommen. 

     - Blue: Integer; 
        Erwartet einen Integer der den neuen Farbwert bestimmt. 
        Der Wert wird zu dem alten Farbwert addiert. 
        Betragt der Wert 0, wird keine Anderung am Farbkanal 
        vorgenommen. 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

 The following Code allows you to change the value of the 
 RGB-Colorchannels (Red, Green, Blue). 
 So you can simply create fantastic effects on your pictures. 

 Parameters: 
   - Bitmap: TBitmap 
      Needs a TBitmap with a picture to read the old values 
      and draw the changes. 

   - Red: Integer 
      A Integer which set the new value of the Color-channel. 
      The value will be add to the old value. 
      If the value is 0, there will be no change in the 
      Color-channel. 

    - Green: Integer; 
       A Integer which set the new value of the Color-channel. 
       The value will be add to the old value. 
       If the value is 0, there will be no change in the 
       Color-channel. 

     - Blue: integer; 
        A Integer which set the new value of the Color-channel. 
        The value will be add to the old value. 
        If the value is 0, there will be no change in the 
        Color-channel. 

 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 Saturday, 2002-09-07 
 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
}


 function SetRGBChannelValue(Bitmap: TBitmap; Red, Green, Blue: Integer): Boolean;
 var
    i, j: Integer;
   rgbc: array[0..2] of Byte;
   c: TColor;
   r, g, b: Byte;
 begin
   //Wenn keine Anderungen vorgenommen werden, Vorgang beenden: 
  //If there is no change, exit: 
  if (Red = 0) and (Green = 0) and (Blue = 0) then
    begin
     Result := False;
     Exit;
   end;

   for i := 0 to Bitmap.Height do
    begin
     for j := 0 to Bitmap.Width do
      begin
       // Get the old Color 
      c := Bitmap.Canvas.Pixels[j, i];
       // Splitt the old color into the different colors: 
      rgbc[0] := GetRValue(c);
       rgbc[1] := GetGValue(c);
       rgbc[2] := GetBValue(c);

       //Check that there is no "new" color while the addition 
      //of the values: 
      if not (rgbc[0] + Red < 0) and not (rgbc[0] + Red > 255) then
         rgbc[0] := rgbc[0] + Red;
       if not (rgbc[1] + Green < 0) and not (rgbc[1] + Green > 255) then
         rgbc[1] := rgbc[1] + Green;
       if not (rgbc[2] + Blue < 0) and not (rgbc[2] + Blue > 255) then
         rgbc[2] := rgbc[2] + Blue;

       r := rgbc[0];
       g := rgbc[1];
       b := rgbc[2];

       //set the new color back to the picture: 
      Bitmap.Canvas.Pixels[j, i] := RGB(r, g, b);
     end;
   end;

   Result := True;
 end;

 //Beispiel, wie man die Funktion benutzen kann: 
//Example, how to use it: 
procedure TForm1.Button1Click(Sender: TObject);
 begin
   SetColorValue(Image1.picture.Bitmap, Spinedit1.Value, Spinedit2.Value,
     Spinedit3.Value);
 end;

Переведенный текст:

Код на Delphi используется для изменения цвета битмап-изображения, модифицируя его каналы RGB (красный, зеленый и синий). Функция SetRGBChannelValue принимает три целочисленных параметра: Red, Green и Blue. Эти значения добавляются к оригинальным цветовым значениям в каждом пикселе битмап-изображения. Если любое из этих значений равно 0, то изменение не будет сделано.

Вот шаг за шагом, как работает код:

  1. Сначала проверяется, если все три входных значения (Red, Green и Blue) равны 0. Если они равны, то функция возвращает False немедленно.
  2. Затем проходит через каждый пиксель битмап-изображения с помощью двух вложенных циклов.
  3. Для каждого пикселя извлекается оригинальное цветовое значение с помощью функций GetRValue, GetGValue и GetBValue.
  4. Проверяется, если добавление входных значений к оригинальным значениям приведет к цвету вне диапазона 0-255. Если нет, то значения добавляются; в противном случае оставляется без изменений.
  5. Наконец, новое цветовое значение устанавливается обратно в битмап-изображение с помощью функции RGB.

Код также включает пример использования этой функции в обработчике события клика кнопки (Button1Click). Пример использует три спин-эдита (Spinedit1, Spinedit2 и Spinedit3) для ввода новых значений для каждого канала цвета.

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

  • Вместо ручного проверки, если сумма оригинального значения и входного значения будет в диапазоне 0-255, можно использовать простую вычисление: rgbc[i] := min(255, max(0, rgbc[i] + c[i])); Это обеспечит, что полученное значение всегда будет находиться в диапазоне.
  • Для улучшения производительности рекомендуется использовать свойство ScanLine канваса битмап-изображения для прохода по пикселям в одном цикле. Это может уменьшить количество доступов к памяти и сделать код более эффективным.

Вот обновленная версия кода, которая включает эти предложения:

function SetRGBChannelValue(Bitmap: TBitmap; Red, Green, Blue: Integer): Boolean;
var
  i, j: Integer;
  rgbc: array[0..2] of Byte;
  c: TColor;
begin
  if (Red = 0) and (Green = 0) and (Blue = 0) then
    begin
      Result := False;
      Exit;
    end;

  for j := 0 to Bitmap.Width do
  begin
    rgbc[0] := GetRValue(Bitmap.Canvas.Pixels[j, 0]);
    rgbc[1] := GetGValue(Bitmap.Canvas.Pixels[j, 0]);
    rgbc[2] := GetBValue(Bitmap.Canvas.Pixels[j, 0]);

    for i := 0 to Bitmap.Height do
    begin
      c := Bitmap.Canvas.Pixels[j, i];
      rgbc[0] := min(255, max(0, rgbc[0] + Red));
      rgbc[1] := min(255, max(0, rgbc[1] + Green));
      rgbc[2] := min(255, max(0, rgbc[2] + Blue));

      Bitmap.Canvas.Pixels[j, i] := RGB(rgbc[0], rgbc[1], rgbc[2]);
    end;
  end;

  Result := True;
end;

Обратите внимание, что я также удалил неиспользуемые переменные r, g и b.

Изменение цветовых каналов битового изображения с помощью функции SetRGBChannelValue, которая позволяет изменять значения красного, зеленого и синего каналов цвета с использованием параметров Bitmap, Red, Green, Blue.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:10:51/0.0059559345245361/1