Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для RiG1
28 / 28 / 4
Регистрация: 12.03.2011
Сообщений: 474

Изменение цвета в изображении с сохранением текстуры

15.02.2014, 22:31. Показов 2857. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется изображение PNG с прозрачностью. Допустим вот такое

Имеется задача менять цвет этого изображения, конкретно отображаемых элементов, не затрагивая прозрачность и не теряя текстуру. При помощи ColorDialog указывать нужный цвет. Тупая замена пикселей на нужный цвет не подходит, ибо теряется текстура. В интернете была найден способ данного преобразования, основанный на переводе цвета в цветовую схему HSV. Конкретнее вот:
В приведенном примере происходит хитрая замена цвета со всеми оттенками. Для удобства используется работа с цветом в формате HSV, т.к. в этом случае гораздо легче выцеплять схожие цвета - они будут попадать в сектор.

Представление цвета в HSV:
Название: 197px-HSV_color_solid_cylinder_alpha_lowgamma.png
Просмотров: 116

Размер: 32.2 Кб
...пробегаем по всем цветам, смотрим попадает ли HSV аналог этого цвета в нужный сектор и если да - запоминаем его смещение относительно центрального. После этого конструируем новый HSV цвет с таким же смещением относительно зеленого и конвертируем обратно в RGB.
Вот только мне непонятно, как это собственно реализовать. Что значит пробегаем по цветам? То есть это будет таже самая попиксельная замена? И как собственно определять смещение и конструировать новый HSV-цвет?
заранее спасибо за пояснения и примеры кода.
P.S. ссылка на статью из цитаты http://vhbit.net/blog/2012/07/... placement/
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2014, 22:31
Ответы с готовыми решениями:

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

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

Определение доминирующего цвета на изображении
Приветствую ребята, подскажите пожалуйста, как определить доминирующие цвета на изображении ? Есть массив пикселей в формате RGB, есть идея...

5
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
15.02.2014, 22:52
Можно попробовать так, правда я не уверен в типе смешивания
C#
1
2
3
4
5
6
7
public static Color Blend(this Color color, Color backColor, double amount)
{
    byte r = (byte) ((color.R * amount) + backColor.R * (1 - amount));
    byte g = (byte) ((color.G * amount) + backColor.G * (1 - amount));
    byte b = (byte) ((color.B * amount) + backColor.B * (1 - amount));
    return Color.FromArgb(r, g, b);
}
1
 Аватар для RiG1
28 / 28 / 4
Регистрация: 12.03.2011
Сообщений: 474
15.02.2014, 23:15  [ТС]
Yukikaze, поподробнее можно, что это такое?
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
16.02.2014, 02:31
Лучший ответ Сообщение было отмечено RiG1 как решение

Решение

Разобрался методом научного тыка, вот что получилось
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
        private void button1_Click(object sender, EventArgs e)
        {
 
            float hue = hueBar.Value;
            float saturation = saturBar.Value / 100f;
            float brightness = brightBar.Value / 100f;
 
 
            var result = ColorizeBitmap(bmp, hue, saturation, brightness, Colorizer);
            pictureBox1.Image = result;
 
        }
 
        private Color Colorizer(Color from, float hue, float saturation, float brightness)
        {
            float oHue, oSatur, oBright;
            ColorToHSV(from, out oHue, out oSatur, out oBright);
 
            return ColorFromHSV(hue, (oSatur * saturation) + (1 - saturation), (oBright * brightness) + (1 - brightness));
        }
 
 
        private unsafe Bitmap ColorizeBitmap(Bitmap source, float hue, float saturation, float brightness, Func<Color, float, float, float, Color> func)
        {
            var result = new Bitmap(source);
            BitmapData data = result.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, source.PixelFormat);
            int PixelSize = 4;
 
            for (int y = 0; y < data.Height; y++)
            {
                byte* row = (byte*)data.Scan0 + (y * data.Stride);
                for (int x = 0; x < data.Width; x++)
                {
                    byte* r = &row[x * PixelSize + 2];
                    byte* g = &row[x * PixelSize + 1];
                    byte* b = &row[x * PixelSize];
 
                    Color newColor = func(Color.FromArgb(*r, *g, *b), hue, saturation, brightness);
 
                    *b = newColor.B;
                    *g = newColor.G;
                    *r = newColor.R;
                }
            }
            result.UnlockBits(data);
            return result;
        }
 
        public static void ColorToHSV(Color color, out float hue, out float saturation, out float value)
        {
            int max = Math.Max(color.R, Math.Max(color.G, color.B));
            int min = Math.Min(color.R, Math.Min(color.G, color.B));
 
            hue = color.GetHue();
            saturation = (max == 0) ? 0 : 1f - (1f * min / max);
            value = max / 255f;
        }
 
        public static Color ColorFromHSV(double hue, double saturation, double value)
        {
            int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
            double f = hue / 60 - Math.Floor(hue / 60);
 
            value = value * 255;
            int v = Convert.ToInt32(value);
            int p = Convert.ToInt32(value * (1 - saturation));
            int q = Convert.ToInt32(value * (1 - f * saturation));
            int t = Convert.ToInt32(value * (1 - (1 - f) * saturation));
 
            switch (hi)
            {
                case 0:
                    return Color.FromArgb(255, v, t, p);
                case 1:
                    return Color.FromArgb(255, q, v, p);
                case 2:
                    return Color.FromArgb(255, p, v, t);
                case 3:
                    return Color.FromArgb(255, p, q, v);
                case 4:
                    return Color.FromArgb(255, t, p, v);
                default:
                    return Color.FromArgb(255, v, p, q);
            }
        }
Результат можно увидеть здесь:
2
 Аватар для RiG1
28 / 28 / 4
Регистрация: 12.03.2011
Сообщений: 474
16.02.2014, 11:15  [ТС]
Yukikaze, вы случаем не сохранили проект, скинуть можете?
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
16.02.2014, 18:19
Лучший ответ Сообщение было отмечено RiG1 как решение

Решение

RiG1, конечно могу, вот держите
Вложения
Тип файла: zip RecolorImage.zip (121.0 Кб, 44 просмотров)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2014, 18:19
Помогаю со студенческими работами здесь

Photoshop: Применение текстуры и цвета к объектам
Доброй всем ночи! В фотошопе хочу изменить цвет букв путем наложения на них фигуры с нужным цветом (текстурой). Подскажите как вырезать...

Подсчет количества элементов одинакового цвета на изображении
В общем нужна программа подсчета количества лесных вырубок на космоснимке. Благодаря этому форуму получилось это: ...

Изменение цвета названия файла/папки (либо цвета подсветки)
Привет супер уважаемые супер форумчане!) Очень интересно, есть ли какой-то способ изменить цвет названия файла/папки, либо изменить цвет...

Изменение цвета текста, когда код цвета берется с сервера
Есть задание : Отправить на сервер название цвета, получить от сервера цвет в формате RGB и изменить цвет текста в поле на полученный от...

Задайте изменение цвета кнопок и цвета шрифта на кнопках формы в ходе выполнения программы
1. Задайте изменение цвета кнопок и цвета шрифта на кнопках формы в ходе выполнения программы. 2. Создайте кнопку «Перемещение формы» ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru