Компьютерная графика, мультимедиа и игры на Visual C#

       

Методика управления цветом изображения 


Листинг 67.1. Метод для вывода двух прямоугольников, заполненных цветом.

private void pictureBox1_Paint(object sender,

                                            PaintEventArgs e)

{

      //Создаем изображение первого прямоугольника,

      //заполненного серым цветом:

      Bitmap myBitmap = new Bitmap(150, 150,

             PixelFormat.Format32bppArgb);

      Graphics g = Graphics.FromImage(myBitmap);

      g.FillRectangle(new SolidBrush(Color.FromArgb(255,

            128, 128, 128)), new Rectangle(0, 0, 150, 150));

      myBitmap.Save("Rectangle1.jpg");

      //Открываем файл изображения и



      //рисуем это первое изображение на экране:

      Image myImage  =

            Image.FromFile("Rectangle1.jpg");

      e.Graphics.DrawImage(myImage, 20, 20);

      //Создаем и инициализируем

      //матрицу цвета myColorMatrix класса ColorMatrix:

      ColorMatrix myColorMatrix = new ColorMatrix();

      myColorMatrix.Matrix00 = 1.7F; // Red

      myColorMatrix.Matrix11 = 1;   // Green

      myColorMatrix.Matrix22 = 1;   // Blue

      myColorMatrix.Matrix33 = 1;   // alpha

      myColorMatrix.Matrix44 = 1;   // w

      //Создаем объект myImageAttributes

      //класса ImageAttributes:

      ImageAttributes myImageAttributes =

            new ImageAttributes();

      //Устанавливаем матрицу цвета myColorMatrix

      //в качестве текущей цветовой модели:

      myImageAttributes.SetColorMatrix(myColorMatrix);

      

      //Создаем второй прямоугольник:

      Rectangle myRectangle2 = new Rectangle(200, 20,

            200, 200);

      //Рисуем на экране второй прямоугольник,

      //заполненный при помощи матрицы цвета myColorMatrix:

      e.Graphics.DrawImage(myImage, myRectangle2, 0, 0,

           200, 200, GraphicsUnit.Pixel, myImageAttributes);

}

В самом верху этого файла Form1.cs подключаем нужное пространство имен:

using System.Drawing.Imaging;

После обычного построения и выполнения программы (Ctrl+F5) появляется форма Form1 с двумя прямоугольниками, из которых первый (слева) заполнен серым цветом, а второй прямоугольник заполнен красным цветом заданной нами (в строке myColorMatrix.Matrix00 = 1.7F;) величины 1.7 (рис. 67.1).


Листинг 67.2. Объявление и инициализация исходных данных.
//Объявляем и инициализируем исходные данные:
static float Alpha = 0.1F;
float Step_of_Color = 0.2F;
float [,] myArray = {{1, 0, 0, 0, 0},
                  {0, 1, 0, 0, 0},
                  {0, 0, 1, 0, 0},
                  {0, 0, 0, Alpha, 0},
                  {0, 0, 0, 0, 1}};
ColorMatrix myColorMatrix = new ColorMatrix();
ImageAttributes myImageAttributes = new ImageAttributes();
Rectangle myRectangle = new Rectangle();
//Присваиваем двум объектам myImage1 и myImage2
//изображения двух обложек книг
//при помощи метода FromFile
//и пути расположения файлов с изображениями:
Image myImage1 =
Image.FromFile("D:/MyDocs/Cover in site/
Cover on VS .NET.jpg");
Image myImage2 =
Image.FromFile("D:/MyDocs/Cover in site/
Cover on VB .NET.jpg");
//Создаем объект myRandom класса Random
//для генерирования случайных чисел:
Random myRandom = new Random();
Листинг 67.3. Метод Form1_Load для Form1.
private void Form1_Load(object sender, EventArgs e)
{
      //Вводим прямоугольник myRectangle с размерами,
      //равными размерам элемента PictureBox:
      myRectangle = new Rectangle(pictureBox1.Location.X,
      pictureBox1.Location.Y,
      this.pictureBox1.Width, this.pictureBox1.Height);
      //Передаем начальные значения
      //диагональных элементов матрицы myArray
      //элементам матрицы цвета myColorMatrix:
      myColorMatrix.Matrix00 = myArray[0, 0];
      myColorMatrix.Matrix11 = myArray[1, 1];
      myColorMatrix.Matrix22 = myArray[2, 2];
      myColorMatrix.Matrix33 = myArray[3, 3];
      myColorMatrix.Matrix44 = myArray[4, 4];
}
Чтобы мультипликационное изображение появилось внутри элемента управления PictureBox, в панели Properties (для этого элемента) на вкладке Events дважды щелкаем по имени события Paint и в появившийся шаблон записываем наш код, после чего метод принимает такой вид.
Листинг 67.4. Код для элемента управления PictureBox.


private void pictureBox1_Paint(object sender,
                                           PaintEventArgs e)
{
      // Рисуем на экране первое изображение myImage1
      //внутри прямоугольника myRectangle:
      e.Graphics.DrawImage(myImage1, myRectangle);
      //Устанавливаем матрицу цвета myColorMatrix
      //в качестве текущей цветовой модели:
      myImageAttributes.SetColorMatrix(myColorMatrix);
      //Рисуем на экране второе изображение myImage2:
      e.Graphics.DrawImage(myImage2, myRectangle,
      pictureBox1.Location.X, pictureBox1.Location.Y,
      myImage2.Width, myImage2.Height,
      GraphicsUnit.Pixel, myImageAttributes);
}
Чтобы подключить к работе таймер, дважды щелкаем значок для компонента Timer (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 67.5. Метод для компонента Timer.
private void timer1_Tick(object sender, EventArgs e)
{
      //Задаем значения элементов
      //матрицы цвета myColorMatrix класса ColorMatrix
      //при помощи объекта myRandom
      //генератора случайных чисел
      //и метода NextDouble, которая возвращает
      //случайное число между 0,0 и 1,0:
      if (Alpha < 0 )
          if (Alpha > 1)
          {
          Step_of_Color = Step_of_Color * (-1);
          myColorMatrix.Matrix01 =
                    Convert.ToSingle(myRandom.NextDouble());
          myColorMatrix.Matrix12 =
               Convert.ToSingle(myRandom.NextDouble());
          myColorMatrix.Matrix23 =
                  Convert.ToSingle(myRandom.NextDouble());
          }
     //Увеличиваем элемент матрицы цвета на один шаг:
     Alpha = Alpha + Step_of_Color;
     myColorMatrix.Matrix33 = Alpha;
     //Перерисовываем экран:
     this.Refresh();
}       
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.


Листинг 67.6. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender, EventArgs e)
{
      timer1.Enabled = true;
      timer1.Interval = trackBar1.Value;
}
Согласно разработанной выше методике, чтобы иметь возможность приостановить (и запустить вновь) процесс анимации на любом рисунке при помощи кнопки Stop Animation, дважды щелкаем эту кнопку в режиме проектирования (рис. 67.2). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 67.7. Метод для кнопки Stop Animation.
bool OffOn = false;
private void button6_Click(object sender, EventArgs e)
{
      if (OffOn == false)
      {
          //Приостанавливаем анимацию:
          timer1.Enabled = false;
          OffOn = true;
      }
      else
      {
           //Возобновляем анимацию:
           timer1.Enabled = true;
           OffOn = false;
      }
}
Листинг 67.8. Метод для компонента PrintDocument.
private void printDocument1_PrintPage(object sender,
              System.Drawing.Printing.PrintPageEventArgs e)
{
      //Печатаем первое изображение myImage1
      //внутри прямоугольника myRectangle:
      e.Graphics.DrawImage(myImage1, myRectangle);
}
Теперь дважды щелкаем кнопку Print (рис. 67.1). Открывается файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 67.9. Метод для кнопки Print.
private void button3_Click(object sender, EventArgs e)
{
     //Передаем объекту PrintDialog1 информацию об объекте
     //PrintDocument1 при помощи свойства Document:
     printDialog1.Document = printDocument1;
     //Выводим стандартную панель Print при помощи метода
     //ShowDialog для задания параметров печати:
     if (printDialog1.ShowDialog() == DialogResult.OK)
         printDocument1.Print();
}

Содержание раздела