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

Листинг 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();

}


Наши рекомендации