Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13

Создание монохромного изображения любого цвета выбранного из палитры

24.05.2016, 23:07. Показов 5018. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте помогите разобраться с монохромностью в любой цвет.
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public partial class Form1 : Form
    {
        int k; int Ih, Iw;
        Bitmap bmp, bitmap1, image;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void открытьToolStripMenuItem_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);
                pictureBox1.Load(dialog.FileName);
                Ih = pictureBox1.Image.Height;
                Iw = pictureBox1.Image.Width;
                pictureBox1.Height = Ih;
                pictureBox1.Width = Iw;
                this.Width = Iw + 16;
                this.Height = Ih + 60;
                bmp = new Bitmap(pictureBox1.Image);
            }
        }
 
        private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog savedialog = new SaveFileDialog();
            savedialog.Title = "Сохранить картинку как ...";
            savedialog.OverwritePrompt = true;
            savedialog.CheckPathExists = true;
            savedialog.Filter =
                "Bitmap File(*.bmp)|*.bmp|" +
                "GIF File(*.gif)|*.gif|" +
                "JPEG File(*.jpg)|*.jpg|" +
                "TIF File(*.tif)|*.tif|" +
                "PNG File(*.png)|*.png";
            savedialog.ShowHelp = true;
            // If selected, save
            if (savedialog.ShowDialog() == DialogResult.OK)
            {
                // Get the user-selected file name
                string fileName = savedialog.FileName;
                // Get the extension
                string strFilExtn =
                    fileName.Remove(0, fileName.Length - 3);
                // Save file
                switch (strFilExtn)
                {
                    case "bmp":
                        bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);
                        break;
                    case "jpg":
                        bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                        break;
                    case "gif":
                        bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif);
                        break;
                    case "tif":
                        bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff);
                        break;
                    case "png":
                        bmp.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
                        break;
                    default:
                        break;
                }
            }
        }
 
        private void восстановитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = bmp;
        }
 
        private void изменитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
 
                float q;
                Color c = new Color();
                c = colorDialog1.Color;
                q = c.GetBrightness();                
                //q = q * 255;
                int R3 = c.R;//razlojenie cveta na rgb
                int G3 = c.G;
                int B3 = c.B;
 
                bitmap1 = new Bitmap(pictureBox1.Image);
                image = new Bitmap(pictureBox1.Image);
                double k, Y, Y1;
                int i, j;
                Y1 = 0;
                for (i = 0; i < Iw; i++)
                {
                    for (j = 0; j < Ih; j++)
                    {
                        int R = bitmap1.GetPixel(i, j).R;
                        int G = bitmap1.GetPixel(i, j).G;
                        int B = bitmap1.GetPixel(i, j).B;
                        Y = 0.3 * R + 0.59 * G + 0.11 * B;
                        Y1 = Y1 + Y;
                    }
                    for (i = 0; i < Iw; i++)
                    {
                        for (j = 0; j < Ih; j++)
                        {
                            int R = bitmap1.GetPixel(i, j).R;
                            int G = bitmap1.GetPixel(i, j).G;
                            int B = bitmap1.GetPixel(i, j).B;
                            k = Y1 / q;//koeffecient otnosheniy yrkosti cveta i pikseley
                            double R1 = R3 * (1 / k);
                            double G1 = G3 * (1 / k);
                            double B1 = B3 * (1 / k);
                            byte R2 = Convert.ToByte(R1);
                            byte G2 = Convert.ToByte(G1);
                            byte B2 = Convert.ToByte(B1);
                            image.SetPixel(i, j, Color.FromArgb(R2, G2, B2));
                            pictureBox1.Image = image;
                        }
                    }
                }
            }
        }
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2016, 23:07
Ответы с готовыми решениями:

Вызов палитры из UserForm и присвоение константе выбранного цвета
Доброго времени суток. Собственно задача и есть созданная тема. Вопрос лишь в том как это реализовать. Для чего присваивать...

Возможно ли программно настроить цвета палитры?
Консоль Windows позволяет настроить каждый из 16 цветов палитры через свойства. Возможно ли сделать это программно?

Как сделать html-страничку с выбором названия цвета и в зависимости от выбранного цвета менять цвет фона?
Как сделать html-страничку с выбором названия цвета и в зависимости от выбранного цвета менять цвет фона? Подскажите, пожалуйста, я...

26
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 10:29
Если речь идет только о двух цветах (черный и белый, без градаций серого), то можно сделать так:
C#
1
2
3
4
        public Color CreateMonochromeColor(Color fromColor)
        {
            return fromColor.R + fromColor.G + fromColor.B > 255*3/2 ? Color.White : Color.Black;
        }

Если ЧБ, то можно попытаться так:
C#
1
2
3
4
5
        public Color CreateBWColor(Color fromColor)
        {
            var middleValue = (fromColor.R + fromColor.G + fromColor.B) / 3;
            return Color.FromArgb(fromColor.A, middleValue, middleValue, middleValue);
        }
сча сам проверю, что написал, выложу пример использования и результат

Добавлено через 12 минут
Grezi126,
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
        public Color CreateMonochromeColor(Color fromColor)
        {
            return fromColor.R + fromColor.G + fromColor.B > 255 * 3 / 2 ? Color.White : Color.Black;
        }
 
        public Color CreateBWColor(Color fromColor)
        {
            var middleValue = (fromColor.R + fromColor.G + fromColor.B) / 3;
            return Color.FromArgb(fromColor.A, middleValue, middleValue, middleValue);
        }
 
        public Bitmap CreateMonochrome(Bitmap fromImage)
        {
            var bitmap = new Bitmap(fromImage.Width, fromImage.Height);
 
            for (int x = 0; x<bitmap.Width; x++)
                for (int y = 0; y < bitmap.Height; y++)
                {
                    bitmap.SetPixel(x,y, CreateMonochromeColor(fromImage.GetPixel(x,y)));
                }
 
            return bitmap;
        }
 
        public Bitmap CreateBWBitmap(Bitmap fromImage)
        {
            var bitmap = new Bitmap(fromImage.Width, fromImage.Height);
 
            for (int x = 0; x < bitmap.Width; x++)
                for (int y = 0; y < bitmap.Height; y++)
                {
                    bitmap.SetPixel(x, y, CreateBWColor(fromImage.GetPixel(x, y)));
                }
 
            return bitmap;
        }
1
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 10:35
Вот результат
Миниатюры
Создание монохромного изображения любого цвета выбранного из палитры   Создание монохромного изображения любого цвета выбранного из палитры  
1
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 11:04  [ТС]
спасибо, дело то в том что мне не нужно ЧБ, и в градации серого, это я знаю как делать, а нужно так что мы открыли изображение потом нажали на пункт меню изменить и нам открывается colorDialog и мы выбираем цвет, потом изображение становиться монохромным по тому цвету который выбрали, получается яркость каждого пикселя остается без изменения, а цвет меняется на тот который выбрали
0
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 11:22
Grezi126,
Не вижу проблем)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        public Color CreateMonochromeColor(Color fromColor, Color forBlack, Color forWhite)
        {
            return fromColor.R + fromColor.G + fromColor.B > 255 * 3 / 2 ? forWhite : forBlack;
        }
 
        public Bitmap CreateMonochrome(Bitmap fromImage, Color forBlack, Color forWhite)
        {
            var bitmap = new Bitmap(fromImage.Width, fromImage.Height);
 
            for (int x = 0; x < bitmap.Width; x++)
                for (int y = 0; y < bitmap.Height; y++)
                {
                    bitmap.SetPixel(x, y, CreateMonochromeColor(fromImage.GetPixel(x, y), forBlack, forWhite));
                }
 
            return bitmap;
        }
 
        pictureBox.Image = CreateMonochrome((Bitmap)bitmap, Color.DarkSlateBlue, Color.NavajoWhite);
в параметры forBlack, forWhite подставляем цвета, которые хотим видеть вместо черного и белого

Можно еще немного подправить код, чтобы можно было регулировать коэффициент, при котором пиксель становится черным или белым
Миниатюры
Создание монохромного изображения любого цвета выбранного из палитры  
1
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 11:57  [ТС]
нужно брать один цвет и делать монохром, а не по двум

Добавлено через 5 минут
видишь на изображении у тебя только белый и синий, но должно быть все синим но картинка остаться четкой
типо полутонного в оттенках одного цвета
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 12:01  [ТС]
и этот цвет выбираешь из палитры
0
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 12:18
Grezi126, это не монохром называется) МОНО - один, ХРОМ - цвет) Это просто черно-белое. Вы скажите, вам нужно менять оттенок и его интенсивность просто?

Добавлено через 13 минут
Grezi126, сча глянул в википедии - там написано, что монохромность - это термин спорный, вообще так называют и ЧБ тоже, но в IT это чаще всего четко различают монохром от простого ЧБ. В нашем контектсе будем считать, что монохромное изображение - это изображение, которое имеет только два цвета (т.н. бинарная монохромность).
1
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 12:24  [ТС]
это как мне препод объяснил, он сказал монохром я так и передал

Добавлено через 1 минуту
видишь картинку с цветами, вот мы берем цветную и делаем ее полутоновой в оттенках одного цвета, и этот цвет мы сами выбираем из палитры
но на деле получается нифига не монохром
0
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 12:27
Grezi126, сча ченить придумаем)
1
103 / 104 / 54
Регистрация: 23.03.2016
Сообщений: 462
25.05.2016, 12:46
Grezi126, если делать только одним цветом, то как отличишь отсутствие цвета?
Второй цвет и будет "отсутствием цвета" и это можно показать например, черным цветом.

Добавлено через 1 минуту
Получается, нужно в https://www.cyberforum.ru/atta... 1464161688 вместо белого (черного) использовать другой цвет, всего то)
0
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 12:50
Quat1111, путаницу внесло слово "монохромность", по факту, подразумевается всего-то наложение оттенка на картинку.
0
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 13:01
Лучший ответ Сообщение было отмечено Grezi126 как решение

Решение

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
        pictureBox2.Image = MultiplyWithColor((Bitmap)bitmap, Color.Yellow);
 
        public Bitmap MultiplyWithColor(Bitmap image, Color color)
        {
            var bitmap = new Bitmap(image.Width, image.Height);
 
            for (int x = 0; x < bitmap.Width; x++)
                for (int y = 0; y < bitmap.Height; y++)
                {
                    bitmap.SetPixel(x, y, Multiply(image.GetPixel(x, y), color));
                }
 
            return bitmap;
        }
 
        public int MiddleValue(int int1, int int2)
        {
            return (int1 + int2)/2;
        }
 
        public Color Multiply(Color color1, Color color2)
        {
            return Color.FromArgb(
                MiddleValue(color1.A, color2.A),
                MiddleValue(color1.R, color2.R),
                MiddleValue(color1.G, color2.G),
                MiddleValue(color1.B, color2.B));
        }
В терминологии не силен, поэтому объясню так: берется одна градация исходно цвета пикселя и одна градация второго цвета (оттенок, который мы выбрали), новое значение создается путем вычисления среднего значения между ними.
Миниатюры
Создание монохромного изображения любого цвета выбранного из палитры  
2
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 13:10  [ТС]
кинь архивом плиз всю папку

Добавлено через 4 минуты
noant, кинь архивом плиз всю папку
0
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 13:17
Grezi126,
Вложения
Тип файла: zip colorTest.zip (56.1 Кб, 17 просмотров)
1
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 13:21  [ТС]
noant, спасибо, ты просто мой спаситель:br avo:
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 14:11  [ТС]
noant, слушай а кинь этот код MultipliedColor.cs в кнопку изменить, там уже добавлено окно цвета где мы выбрали цвет
и то я хз как его туда запихать
и изображение которое получили в этот же битмап запихать
Вложения
Тип файла: rar WindowsFormsApplication2.rar (52.0 Кб, 9 просмотров)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
25.05.2016, 14:28
Цитата Сообщение от noant Посмотреть сообщение
В терминологии не силен, поэтому объясню так: берется одна градация исходно цвета пикселя и одна градация второго цвета (оттенок, который мы выбрали), новое значение создается путем вычисления среднего значения между ними.
Ну среднее это же не то что нужно. Результирующее изображение не будет в градациях одного цвета. Оно у вас будет содержать разные цвета.
Нужно брать яркость (Color.GetBrightness) пиксела из исходного изображения, умножать на нее целевой цвет, и заносить это произведение в выходное изображение.
1
14 / 14 / 3
Регистрация: 16.05.2016
Сообщений: 47
25.05.2016, 14:42
Storm23, ну, изображение и не должно полностью стать одноцветным, там всего-лишь каждый пиксель приближается к цвету, который мы задаем. Можно накладывать оттенок разными способами, если взглянуть в фотошопе, то там их много. И да, ваш вариант мне больше нравится

C#
1
2
3
4
5
public static Color Multiply(Color color1, Color color2)
{
       var brightness = color1.GetBrightness();
       return Color.FromArgb(color1.A, (int)(color2.R*brightness), (int)(color2.G*brightness), (int)(color2.B*brightness));
}
Добавлено через 3 минуты
Цитата Сообщение от Grezi126 Посмотреть сообщение
noant, слушай а кинь этот код MultipliedColor.cs в кнопку изменить, там уже добавлено окно цвета где мы выбрали цвет
и то я хз как его туда запихать
и изображение которое получили в этот же битмап запихать
Слабо файлы в проект добавить? Там же все просто.
0
0 / 0 / 0
Регистрация: 24.05.2016
Сообщений: 13
25.05.2016, 14:48  [ТС]
получается MultipliedColor.cs это класс и его просто кинуть в проект
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2016, 14:48
Помогаю со студенческими работами здесь

Изменение цвета палитры с более на менее яркий
Люди добрые, подскажите, как изменить яркость палитры. Сейчас палитра очень яркая и неудобно ей пользоваться, необходимо, чтобы цвета...

Обработка изображения смена палитры
Здравствуйте.Моя задача состоит в том , чтобы изображение менялось на такое же как было, но где один из цветов менялся на заданный...

При выборе из цветовой палитры - цвета отображены черным (Excel 2000, 2003)
Мне предложили разобраться с файлами. Макросов нет. Явно где-то в настройках файла. 1) При открывании файла в Excel 2000, 2003 цветовая...

Создание SEGA палитры на PictureBox
Здравствуйте. Есть код на языке PureBasic ;{ создание глобальной палитры Global Dim FullPalette.l(513) ; главный массив с 512 ячейками,...

Динмаическое создание компонента (не из палитры)
Добрый день! Помогите пожалуйста разобраться с ситуацией. Хочу написать небольшой компонент на основе TCustomPanel. Создал...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru