Программирование мультимедиа-систем. Баканов В.М. - 22 стр.

UptoLike

Составители: 

- 22 -
В модуле main.cpp проекта Paint.bpr изменение цвета осуществляется
функцией ChangeColorAndIntensity (приведен пример нескольких преобразо-
ваний, определяемых значением управляющей переменной rule):
Int iX,iY;
short colR, colG, colB, intCol, // 0-255 интенсивность цвета (8 бит)
selColor = clRed;
float A=0.0, B=-0.0039370079, C= 0.0039370079; // кривая в) на рис.2.2 и табл.2
colImage = new TImage(this); // внеэкранный битовый контейнер
colImage->Picture = Image1->Picture; // скопировали изображение в colImage
for (iX=0; iX<nX; iX++) // цикл по абсциссам пикселов ИЗОБРАЖЕНИЯ
for (iY=0; iY<nY; iY++) // цикл по ординатам
{
// получить интенсивности цветов из внеэкранного контейнера
colR=GetRValue(colImage->Canvas->Pixels[iX][iY]); // интенсивность цвета R
colG=GetGValue(colImage->Canvas->Pixels[iX][iY]); // …цвета G
colB=GetBValue(colImage->Canvas->Pixels[iX][iY]); // …цвета B
switch (rule) // переменная rule определяет режим преобразования цвета
{
case 1: // преобразовать в оттенки серого ============================
// среднее арифметическое из интенсивностей всех цветов
intCol=(colR+colG+colB)/3;
Image1->Canvas->Pixels[iX][iY] = RGB(intCol, intCol, intCol);
break;
case 2: // преобразовать в заданный цвет selColor ======================
Image1->Canvas->Pixels[iX][iY] = RGB(GetRValue(selColor)*intCol/255,
GetGValue(selColor)*intCol/255,
GetBValue(selColor)*intCol/255);
break;
case 3: // уменьшить интенсивность всех цветов вдвое ==================
Image1->Canvas->Pixels[iX][iY] = RGB(colR/2, colG/2, colB/2);
break;
case 3: // заданные полиномом преобразования цветов =================
// используем схему Горнера для вычисление полинома y=A+B*x+С*x*x
// где A,B,C – известные коэффициенты полинома, x,y – интенсивности
// исходного и преобразованного цветов соответственно
colR = A + colR * (B + C * colR); // интенсивность цвета R
colG = A + colG * (B + C * colG); // …цвета G
colB = A + colB * (B + C * colB); // …цвета B
Image1->Canvas->Pixels[iX][iY] = RGB(colR, colG, colB);
break;
default: // другие значения rule пока не рассматриваются… ==============
break;
} // конец CASE
} // конец цикла по пикселам изображения (по iX,iY)
  В модуле main.cpp проекта Paint.bpr изменение цвета осуществляется
функцией ChangeColorAndIntensity (приведен пример нескольких преобразо-
ваний, определяемых значением управляющей переменной rule):

  Int iX,iY;
  short colR, colG, colB, intCol, // 0-255 интенсивность цвета (8 бит)
         selColor = clRed;
  float A=0.0, B=-0.0039370079, C= 0.0039370079; // кривая в) на рис.2.2 и табл.2
  …
  colImage = new TImage(this); // внеэкранный битовый контейнер
  colImage->Picture = Image1->Picture; // скопировали изображение в colImage
  …

  for (iX=0; iXCanvas->Pixels[iX][iY]); // интенсивность цвета R
     colG=GetGValue(colImage->Canvas->Pixels[iX][iY]); // …цвета G
     colB=GetBValue(colImage->Canvas->Pixels[iX][iY]); // …цвета B

  switch (rule) // переменная rule определяет режим преобразования цвета
   {
    case 1: // преобразовать в оттенки серого ============================
             // среднее арифметическое из интенсивностей всех цветов
             intCol=(colR+colG+colB)/3;
             Image1->Canvas->Pixels[iX][iY] = RGB(intCol, intCol, intCol);
             break;
    case 2: // преобразовать в заданный цвет selColor ======================
             Image1->Canvas->Pixels[iX][iY] = RGB(GetRValue(selColor)*intCol/255,
                                                      GetGValue(selColor)*intCol/255,
                                                      GetBValue(selColor)*intCol/255);
             break;
    case 3: // уменьшить интенсивность всех цветов вдвое ==================
             Image1->Canvas->Pixels[iX][iY] = RGB(colR/2, colG/2, colB/2);
             break;
    case 3: // заданные полиномом преобразования цветов =================
            // используем схему Горнера для вычисление полинома y=A+B*x+С*x*x
            // где A,B,C – известные коэффициенты полинома, x,y – интенсивности
            // исходного и преобразованного цветов соответственно
            colR = A + colR * (B + C * colR); // интенсивность цвета R
            colG = A + colG * (B + C * colG); // …цвета G
            colB = A + colB * (B + C * colB); // …цвета B
            Image1->Canvas->Pixels[iX][iY] = RGB(colR, colG, colB);
            break;
    default: // другие значения rule пока не рассматриваются… ==============
            break;
   } // конец CASE

  } // конец цикла по пикселам изображения (по iX,iY)


                                       - 22 -