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

Смешать два цвета с использованием коэффициента прозрачности

Delphi , Графика и Игры , Цвета и Палитра

Смешать два цвета с использованием коэффициента прозрачности

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

// This function mixes two bytes According to value of TRANS 
// The value of TRANS is between 0 (result then will be equal to FG) 
// and 255 (result then will be equal to BG) 
function MixBytes(FG, BG, TRANS: byte): byte;
 asm
   push bx  // push some regs 
  push cx
   push dx
   mov DH,TRANS // remembering Transparency value (or Opacity - as you like) 
  mov BL,FG    // filling registers with our values 
  mov AL,DH    // BL = ForeGround (FG) 
  mov CL,BG    // CL = BackGround (BG) 
  xor AH,AH    // Clear High-order parts of regs 
  xor BH,BH
   xor CH,CH
   mul BL       // AL=AL*BL 
  mov BX,AX    // BX=AX 
  xor AH,AH
   mov AL,DH
   xor AL,$FF   // AX=(255-TRANS) 
  mul CL       // AL=AL*CL 
  add AX,BX    // AX=AX+BX 
  shr AX,8     // Fine! Here we have mixed value in AL 
  pop dx       // Hm... No rubbish after us, ok? 
  pop cx
   pop bx       // Bye, dear Assembler - we go home to Delphi! 
end;

 // Here we mix R,G and B channels of our colors separately. 
// The value of T is between 0 and 255 as described above. 

// As you know, TColor value is 4 bytes length integer value where 
// low byte is red channel, 2nd byte is green and 3rd byte is blue 

function MixColors(FG, BG: TColor; T: byte): TColor;
 var r,g,b:byte;
 begin
   R := MixBytes(FG and 255,BG and 255,T); // extracting and mixing Red 
  G := MixBytes((FG shr 8) and 255,(BG shr 8) and 255,T); // the same with green 
  B := MixBytes((FG shr 16) and 255,(BG shr 16) and 255,T); // and blue, of course 
  Result := r+g*256+b*65536; // finishing with combining all channels together 
end;

Перевод контента на русский язык:

Данное решение - это программный код на языке Delphi для смешивания двух цветов с прозрачностью. Функция MixBytes принимает три параметра: передний план (FG), фон (BG) и значение прозрачности (TRANS). Она использует ассемблерный код для смешивания значений RGB цветов на основе значения прозрачности.

Функция MixColors - это процедура Delphi, которая вызывает MixBytes три раза, один раз для каждого канала цвета (красный, зеленый, синий). Затем она комбинирует смешанные значения для создания нового значения типа TColor.

Рассмотрим как работает код:

  1. Функция MixBytes:
    • Пушит некоторые регистры на стек с помощью push bx, push cx и push dx.
    • Зарядит значение прозрачности (TRANS) в регистр DH.
    • Зарядит значения переднего плана (FG) и фона (BG) в регистры BL и CL соответственно.
    • Вычисляет смешанный RGB-значение, умножая цвет переднего плана на значение прозрачности, а затем добавляя результат к продукту цвета фона и (255 - TRANS). Инструкция mul умножает регистры, а инструкция add добавляет результаты. Инструкция shr сдвигает результат вправо на 8 бит для получения окончательного смешанного значения.
    • Возвращает регистры с помощью pop dx, pop cx и pop bx.
  2. Функция MixColors:
    • Извлекает красный, зеленый и синий каналы из цветов переднего плана и фона с помощью битовых операций AND (and 255) и сдвигов (shr 8).
    • Вызывает MixBytes три раза для смешивания каждого канала цвета на основе значения прозрачности.
    • Комбинирует смешанные цветовые каналы в одиночное значение типа TColor с помощью арифметических операций.

Код предполагает, что входные цвета представляют собой значения типа TColor, которые являются 4-bytными целыми числами, где низкий байт представляет красный канал, второй байт - зеленый канал, а третий байт - синий канал. Значение прозрачности (TRANS) должно быть byte-значением между 0 (полностью прозрачным) и 255 (полностью не прозрачным).

Этот код можно использовать для создания эффектов смешивания цветов с различными степенями прозрачности. Например, вы можете использовать его для.fade one color into another или для blend two colors together while maintaining some level of transparency.

Альтернативное решение может заключаться в реализации аналогичного эффекта с помощью встроенных функций и операторов Delphi, таких как арифметические операции TColor, битовые сдвиги и условные операторы. Однако это, вероятно, потребует больше строк кода и может не быть так эффективным, как ассемблерный подход, использованный в этом примере.

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


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

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




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


:: Главная :: Цвета и Палитра ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 13:19:08/0.0052518844604492/1