Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 02.03.2016
Сообщений: 60

Градация цветов

21.05.2017, 13:56. Показов 6360. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток, добрые люди, помогите с заданием! Само задание звучит так: Создайте функцию, выводящую на изображение ромб. Все точки вне ромба переводятся в градации серого цвета. Для всех точек внутри ромба оставьте только канал G.
Не могу понять, как сделать внутренность ромба
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace _4_лаба_кг
{
    public partial class Form1 : Form
    {
        private Bitmap bmp;
        private Graphics g;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //открытие файла 
            OpenFileDialog dialog = new OpenFileDialog();
            //задаем расширения файлов 
            dialog.Filter = "Image files (*.BMP, *.JPG, *.GIF, *.TIF, *.PNG, *.ICO, *.EMF, *.WMF)|*.bmp;*.jpg;*.gif; *.tif; *.png; *.ico; *.emf; *.wmf";
            if (dialog.ShowDialog() == DialogResult.OK)//вызываем диалоговое окно 
            {
                Image image = Image.FromFile(dialog.FileName); //Загружаем в image 
                                                               //изображение из выбранного файла 
 
                bmp = new Bitmap(image, pictureBox1.Width, pictureBox1.Height); //создаем и загружаем из 
                                                                                //image изображение в формате bmp 
                pictureBox1.Image = bmp; //записываем изображение в формате bmp 
                                         //в pictureBox1 
                g = Graphics.FromImage(pictureBox1.Image); //подготавливаем объект 
                                                           //Graphics для рисования в pictureBox1 
            }
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
 
            Graphics gr = Graphics.FromImage(pictureBox1.Image);
            Pen p1 = new Pen(Color.Black, 3);
            Point[] romb = new Point[4];
 
            romb[0].X = pictureBox1.Width / 2; romb[0].Y = (pictureBox1.Height / 2) - 100;
            romb[1].X = (pictureBox1.Width / 2) - 55; romb[1].Y = pictureBox1.Height / 2;
            romb[2].X = pictureBox1.Width / 2; romb[2].Y = (pictureBox1.Height / 2) + 100;
            romb[3].X = (pictureBox1.Width / 2) + 55; romb[3].Y = pictureBox1.Height / 2;
 
            gr.DrawPolygon(p1, romb);
            pictureBox1.Image = bmp;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            //циклы для перебора всех пикселей на изображении 
            for (int i = 0; i < bmp.Width; i++)
                for (int j = 0; j < bmp.Height; j++)
                {
                    int R = bmp.GetPixel(i, j).R; //извлекаем долю красного цвета 
                    int G = bmp.GetPixel(i, j).G; //извлекаем долю зеленого цвета 
                    int B = bmp.GetPixel(i, j).B; //извлекаем долю синего цвета 
                    int Gray = (R + G + B) / 3; // высчитываем среднее 
                    Color p = Color.FromArgb(255, Gray, Gray, Gray);
                    /*переводим int в значение цвета. 255 – показывает степень прозрачности. осталь-
                    ные значения одинаковы для трех каналов R,G,B */
                    bmp.SetPixel(i, j, p); //записываем полученный цвет в точку 
                }
            Refresh(); //вызываем функцию перерисовки окна 
 
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2017, 13:56
Ответы с готовыми решениями:

Создать гистограмму цветов из цветов загруженного изображения и искать с помощью нее пиксели одинакового цвета
Необходимо создать гистограмму цветов из цветов загруженного изображения и искать с помощью нее пиксели одинакового цвета. Нужно переделать...

Распознавание цветов
Нужно написать нейронную сеть, в которую на входе мы даем RGB, а на выходе (к примеру имеем 4 любых цвета) она нам говорит на какой цвет...

GetPixel не соответствие цветов
Доброго времени суток. В общем ситуация такая, я создаю bitmap, попиксельно заполняю его тремя разными цветами,белым,синим и черным. Потом...

2
-2 / 0 / 0
Регистрация: 14.11.2022
Сообщений: 28
06.04.2023, 08:16
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
// Получаем ширину и высоту растрового изображения
            int width = bmp.Width;
            //ширина
            int height = bmp.Height;
            //высота
            // Вычисляем центральную точку изображения
            int centerX = width / 2;
            int centerY = height / 2;
            // Вычислили половину диагонали изображения
            int halfDiagonal = (int)(Math.Sqrt(centerX * centerX + centerY * centerY) / 2);
            // Массив , вершины ромба.
            //centerX: Это координата x центральной точки ромба.
            //centerY: это y-координата центральной точки ромба.
            //halfDiagonal: это половина длины одной из диагоналей ромба.
            //Ромб - это четырехугольник, все стороны которого имеют одинаковую длину.
            Point[] rhombusPoints = new Point[] {
        new Point(centerX - halfDiagonal, centerY),
        // Вершина левая от центра
        new Point(centerX, centerY + halfDiagonal),
        //Вершина над центральной точкой
        new Point(centerX + halfDiagonal, centerY),
        //Вершина правая от центра
        new Point(centerX, centerY - halfDiagonal)};
            // Вершина Низ ромба
            // Цикл по каждому пикселю в растровом изображении
            for (int i = 0; i < width; i++)
            //Эта строка инициализирует цикл, который повторяется по горизонтальной оси растрового изображения, от левого края к правому краю.
            {
                for (int j = 0; j < height; j++)
                //Эта строка инициализирует вложенный цикл, который повторяется по вертикальной оси растрового изображения, от верхнего края до нижнего края.
                {
                    //Если пиксель находится внутри ромба, установливает его цвет на зеленый
                    if (IsPointInsideRhombus(new Point(i, j), rhombusPoints))
                    //Функция передает два аргумента: новый точечный объект, созданный с текущими координатами пикселей (i, j), и массив точечных объектов, которые определяют вершины ромба.
                    {
                        Color pixel = bmp.GetPixel(i, j);
                        //извлекает цвет текущего пикселя из растрового изображения с помощью метода "GetPixel" и сохраняет его в объекте "Color" с именем "pixel".
                        bmp.SetPixel(i, j, Color.FromArgb(pixel.A, 0, pixel.G, 0));
                        //Эта строка устанавливает цвет текущего пикселя на зеленый, вызывая метод "SetPixel" и передавая координаты текущего пикселя (i, j) и новый объект "Color",
                    }
                    // В противном случае вне ромба преобразуется пиксели в оттенки серого
                    else
                    {
                        Color pixel = bmp.GetPixel(i, j);
                        int gray = (int)(0.299 * pixel.R + 0.587 * pixel.G + 0.114 * pixel.B);
                        // Пиксели которые не входят в ромб красятся в серый
                        bmp.SetPixel(i, j, Color.FromArgb(pixel.A, gray, gray, gray));
                        //Эта строка устанавливает цвет текущего пикселя в оттенки серого, вызывая метод "SetPixel" и передавая координаты текущего пикселя (i, j) и новый объект "Color"
                        //код перебирает все пиксели в растровом изображении и применяет фильтр, который окрашивает пиксели внутри ромба 
                        //в зеленый цвет и преобразует пиксели за пределами ромба в оттенки серого.
                    }
                }
            }
            // Обновление дисплея, чтобы отобразить обновленное растровое изображение
            Refresh();
        }
        // Этот метод проверяет, находится ли данная точка внутри ромба
        private bool IsPointInsideRhombus(Point point, Point[] rhombusPoints)
        {
            // Инициализируется переменную isInside значением false, а j - индексом последней вершины
            bool isInside = false;
            int j = rhombusPoints.Length - 1;
            // Выполняет итерацию по каждой вершине в массиве точек ромба
            for (int i = 0; i < rhombusPoints.Length; i++)
            {
                // Проверяет   , образуют ли текущая вершина и предыдущая вершина (с индексом j) линию
                // сегмент, пересекающий горизонтальную линию, проходящую через контрольную точку
                if (rhombusPoints[i].Y < point.Y && rhombusPoints[j].Y >= point.Y
                    || rhombusPoints[j].Y < point.Y && rhombusPoints[i].Y >= point.Y)
                {
                    // Вычислите координату x точки пересечения прямой
                    // сегмент и горизонтальная линия, проходящая через контрольную точку
                    if (rhombusPoints[i].X + (double)(point.Y - rhombusPoints[i].Y) / (rhombusPoints[j].Y - rhombusPoints[i].Y)
                        * (rhombusPoints[j].X - rhombusPoints[i].X) < point.X)
                    {
                        // Проверяет, находится ли координата x точки пересечения слева 
                        isInside = !isInside;
                    }
                }
                // Обновление j, чтобы он был индексом текущей вершины, которая будет использоваться в качестве предыдущей
                // вершина в следующей итерации цикла
                j = i;
            }
            // // Возвращает конечное значение is Inside, которое будет истинным, если тестовая точка находится внутри
            // ромб и false в противном случае
            return isInside;
        }
0
8 / 6 / 2
Регистрация: 25.12.2011
Сообщений: 116
06.04.2023, 14:21
Пример для рисования заполненного ромба:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button2_Click(object sender, EventArgs e)
{
    Graphics gr = Graphics.FromImage(pictureBox1.Image);
    Pen p1 = new Pen(Color.Black, 3);
    Brush b1 = new SolidBrush(Color.Red); // задаем цвет заполнения
    Point[] romb = new Point[4];
 
    romb[0].X = pictureBox1.Width / 2; romb[0].Y = (pictureBox1.Height / 2) - 100;
    romb[1].X = (pictureBox1.Width / 2) - 55; romb[1].Y = pictureBox1.Height / 2;
    romb[2].X = pictureBox1.Width / 2; romb[2].Y = (pictureBox1.Height / 2) + 100;
    romb[3].X = (pictureBox1.Width / 2) + 55; romb[3].Y = pictureBox1.Height / 2;
 
    gr.FillPolygon(b1, romb); // заполняем ромб выбранным цветом
    gr.DrawPolygon(p1, romb);
    pictureBox1.Image = bmp;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2023, 14:21
Помогаю со студенческими работами здесь

Замена цветов на картинке
Здравствуйте. Вот код покраски сейчасный: void SetPaletteExample(string aNewPalette) { Bitmap GX_BufExample =...

ООП: Определить иерархию цветов
задача Определить иерархию цветов. Создать несколько объектов-цветов. Собрать букет (используя аксессуары) с определением его стоимости....

Инициализировать массив названиями цветов
/*Дан массив из названий цвета.С клв вводится слово.Если оно задает название цвета. * Сохранить его в переменную x.Иначе вывод сообщения...

Присвоение цветов в консольном приложении
Можно ли в консольном приложении присвоить цвета к переменным ? Например мне не удобно прописывать постоянно вот это: ...

Матрица цветов преобразование RGB
Привет, нужно преобразовать RGB цвет, например rgb(55, 55, 55) в такую матрицу цветов. var magEffectInvert = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru