Глава 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();
}