Эффект радуги изображения в C#
Этот пример расширяет сообщение Использовать объект ImageAttributes для применения общих цветовых тонов к изображению на C# для радуги изображения. Он отбивает изображение на куски, а затем использует методы предыдущего примера для преобразования фигур в разные цветовые тона для создания эффекта радуги.
Следующий код показывает, как программа раскрашивает свое изображение.
// Обработать изображение. private void Form1_Load(object sender, EventArgs e) { // Создание выходного изображения. Image original = picImage.Image; int wid = original.Width; int hgt = original.Height; Bitmap bm = new Bitmap(wid, hgt); using (Graphics gr = Graphics.FromImage(bm)) { // Определение целевых цветов. Color[] color = { //Color.Red, Color.Orange, Color.Yellow, //Color.Green, Color.Blue, Color.Indigo, //Color.Violet, Color.Red, Color.OrangeRed, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Fuchsia, }; const float scale = 2.0f; // Привлечь. for (int i = 0; i < color.Length; i++) { // Создаем ColorMatrix. ColorMatrix cm = new ColorMatrix(new float[][] { new float[] {color[i].R / 255f * scale, 0, 0, 0, 0}, new float[] {0, color[i].G / 255f * scale, 0, 0, 0}, new float[] {0, 0, color[i].B / 255f * scale, 0, 0}, new float[] {0, 0, 0, 1, 0}, new float[] {0, 0, 0, 0, 1}, }); ImageAttributes attr = new ImageAttributes(); attr.SetColorMatrix(cm); // Нарисуем следующую часть изображения. int x = (int)(i * original.Width / color.Length); Point[] points = { new Point(x, 0), new Point(wid, 0), new Point(x, hgt), }; Rectangle rect = new Rectangle(x, 0, wid - x, hgt); gr.DrawImage(original, points, rect, GraphicsUnit.Pixel, attr); } } // Отображение результата. picImage.Image = bm; // Сохраним результат. bm.Save("Rainbow.png", ImageFormat.Png); }
Программа начинается с создания Bitmap того же размера, что и исходное изображение, и создавая объект Graphics для работы с Bitmap , Он определяет массив, содержащий цвета, которые он будет использовать для тонирования изображения, а затем вводит цикл, который выполняется один раз для каждого из цветов.
Для каждого цвета программа создает ColorMatrix, которая использует красные, зеленые и синие цветовые компоненты цвета для масштабирования выходного цвета на изображении. Например, предположим, что один из цветов в массиве желтый, с большими красными и зелеными компонентами и небольшим синим компонентом. Программа инициализирует ColorMatrix, чтобы увеличить красные и зеленые компоненты результата и уменьшить синий компонент. Когда код применяет эту матрицу к пикселю изображения, результат смещается в сторону желтого тона.
После создания ColorMatrix программа создает объект ImageAttributes и устанавливает его ColorMatrix в тот, который он создал.
Далее программа определяет массив точек, представляющих следующий фрагмент изображения для рисования. Если это номер цвета i, программа рисует i th часть изображения. Он рисует весь путь до правого края изображения, поэтому цветные части изображения перекрываются. Это предотвращает отсутствие пикселов между фрагментами путем округления ошибок. (Это немного неэффективно, потому что программа перекрашивает самые правые пиксели один раз для каждого цвета. Однако метод довольно быстрый, поэтому я не буду беспокоиться об этом.)
Программа создает Rectangle, чтобы определить область в исходном изображении, которая должна быть вписана в новый Bitmap. Затем он использует метод DrawImage для рисования выделенной части изображения в Bitmap, применяя ColorMatrix к своим пикселям.