Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
1
.NET 4.x

Быстрая попиксельная замена нескольких цветов у картинки и остальная работа с графикой

07.08.2020, 16:20. Показов 4241. Ответов 61
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Подскажите как быстро делать замену нескольких цветов у картинки + накладывание картинки на картинку или отрисовка в нужных позициях. И также маштабирование Для точности нужно использовать циклы по пиксельно или както по другому но нужно заменять только при полном совпадении.
Но мне нужен быстрые способы. Стандартные методы делают это медленно. OpenGL да, но я вот тока не знаю как в нем работать. Там для меня трудная система коррдинат по Float системе. Да и плюс может есть чтото полегче

Короче надеюсь есть те кто ответят. Уроки, примеры хоть что

И так. Нужны 3 вещи.

1. Накладывание одной картинки на другую.
2. Отрисовка нескольких картинок в нужных позициях. Именно что не 1 картинка а несколько.
3. Замена массива цветов (Предположим 10 - 15 цветов) в картинки. Тоесть есть массив с исходными цветами а есть на которые нужно менять.
4. Изменение маштаба картинки / картинок

Первые 2 по сути как 1 идет просто в 1 случае используеться 0 координата.

И повторюсь. Интересуют быстрая реализация на уровне реализации игр но это не игра а утилита. Ну короче быстро это делать.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2020, 16:20
Ответы с готовыми решениями:

Быстрая работа с графикой
Добрый день. интересует способ быстрого выведения множества пикселей на экран. мне не нужны...

Попиксельная обработка картинки средствами VBA
Доброго всем времени суток. Проблемка: Есть графический файл. Чтоб не распылятся об различиях...

Есть н цветов разных видов. Составьте все возможные сочетания букетов из всех этих цветов. Количество цветов и их названия вводит пользователь
Есть n цветов разных видов. Составьте все возможные сочетания букетов из всех этих цветов....

Различие цветов однотонной картинки
Проблема такая background задан png картинкой, а снизу на after полоска такого же цвета, но просто...

61
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
08.08.2020, 11:13  [ТС] 2
Может кто ответит. Любая помощь. Профан в этом вопросе. SetPixel и GetPixel работают медленно. Есть и другие средства. Ну мне подсказывали. Пролблема в том что для большого размера картинок они тоже медленные. Размер картиноек большой примерно 800 x 600
0
264 / 183 / 87
Регистрация: 03.05.2020
Сообщений: 790
08.08.2020, 11:15 3
ну дайте картинку и что на что поменять
0
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
08.08.2020, 11:22 4
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Есть и другие средства
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
они тоже медленные
покажите, интересно
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
08.08.2020, 11:25  [ТС] 5
Цитата Сообщение от AnyKey Посмотреть сообщение
ну дайте картинку и что на что поменять
Картинку дать не могу. Да сойдет любая большая картинка где штук 15 - 20 цветов на другие цвета нужно поменять. Для очень высокой точности нужно попиксельно это делать. Хотя не знаю. Сам цикл на примере с картинкой 800 x 600 это получается 800 * 600 * 20 = 9600000.
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
08.08.2020, 11:27 6
https://github.com/SixLabors/ImageSharp
1
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
08.08.2020, 11:35  [ТС] 7
Цитата Сообщение от alexus5 Посмотреть сообщение
покажите, интересно
Ну на пример вот
https://www.codeproject.com/Ti... n-Csharp-3
Ну да. Быстрее чем SetPixel но это все равно медленно для большого размеера картинок.

Добавлено через 4 минуты
Цитата Сообщение от Someone007 Посмотреть сообщение
https://github.com/SixLabors/ImageSharp
Не подходит. Net Framework 4.0 или ниже но никак не выше
0
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
08.08.2020, 11:45 8
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ну на пример вот
есть простор для оптимизации. Попробуйте работать с цветом через структуру, которая соответствует хранению данных 32-битного цвета в памяти.
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
    public struct Color32
    {
        public byte b;
        public byte g;
        public byte r;
        public byte a;
 
        public Color32(byte b, byte g, byte r, byte a)
        {
            this.b = b;
            this.g = g;
            this.r = r;
            this.a = a;
        }
        /// <summary>
        /// From bgra normalized array
        /// </summary>
        /// <param name="a"></param>
        public Color32(double[] a)
            : this((byte)(255 * a[0]), (byte)(255 * a[1]), (byte)(255 * a[2]), (byte)(255 * a[3])){ }
        public Color32(Color c)
        {
            b = c.B;
            g = c.G;
            r = c.R;
            a = c.A;
        }
        public Color ToColor()
        {
            return Color.FromArgb(a, r, g, b);
        }
        public unsafe int ToARGB()
        {
            return (((((a << 8) | r ) << 8) | g) << 8 ) | b;
        }
        public double[] ToArray()
        {
            return new double[] { b, g, r };
        }
        public override string ToString()
        {
            return $"argb = ({a}, {r}, {g}, {b})";
        }
 
        public static int Manh(Color32 c1, Color32 c2)
        {
            return Math.Abs(c1.b - c2.b) + Math.Abs(c1.g - c2.g) + Math.Abs(c1.r - c2.r) + Math.Abs(c1.a - c2.a);
        }
 
        public static int Euclidean(Color32 c1, Color32 c2)
        {
            return (int)Math.Sqrt((c1.b - c2.b) * (c1.b - c2.b) + (c1.g - c2.g) * (c1.g - c2.g) + (c1.r - c2.r) * (c1.r - c2.r));
        }
 
        public static unsafe bool operator == (Color32 c1, Color32 c2)
        {
            return *(int*)&c1.b == *(int*)&c2.b;
        }
        public static unsafe bool operator != (Color32 c1, Color32 c2)
        {
            return *(int*)&c1.b != *(int*)&c2.b;
        }
 
        public static Color32
            White = new Color32(Color.White),
            Black = new Color32(Color.Black),
            Transparent = new Color32(Color.Transparent);
    }
0
264 / 183 / 87
Регистрация: 03.05.2020
Сообщений: 790
08.08.2020, 11:45 9
Alexandr_7, нет так нет, с чем же тогда SetPixel и GetPixel сравнивать ...
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
08.08.2020, 11:58 10
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Не подходит. Net Framework 4.0 или ниже но никак не выше
Зачем себя старьем ограничивать? Я всегда использую только последние версии VS/C#/.NET и проблем не знаю...
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
08.08.2020, 12:12  [ТС] 11
Ну если для примера то вот картинка:
https://yadi.sk/i/PjzRgG2MZINljA
И список цветов на которые нужно заменить
Код
#FFDA91 на #0048FF
#DAB66D на #0048DA
#B69148 на #0048B6
#916D24 на #004891
#6D4800 на #00246D
#482424 на #002448
#240000 на #000024
Цитата Сообщение от Someone007 Посмотреть сообщение
Зачем себя старьем ограничивать? Я всегда использую только последние версии VS/C#/.NET и проблем не знаю...
Затем что NET 4.0 есть в любой системе а вот более новые версии в XP так вообще не поддерживаются а в 7 так вообще вручную ставить что не есть хорошо. Одними словами для мня это кретично и убеждать в обратном не надо. Да и вообще SixLabors.ImageSharp он не под NET Framework а NET Core. Предположу что NET Core не поддерживает ничего кроме 10 но точно не знаю. Но знаю 100 процентов что туда до сих пор не завезли конструктора WinForms
А это мне кучу проблем доставит. Тоесть вручную прописывать каждый элекмент и настройка а элементов дофига. Я это сколько времени должен угробить.
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
08.08.2020, 12:30 12
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Затем что NET 4.0 есть в любой системе а вот более новые версии в XP так вообще не поддерживаются а в 7 так вообще вручную ставить что не есть хорошо.
Давно пора установить актуальную версию OS, а не сидеть на неподдерживаемом старье, отсюда и проблемы со всем чем только можно: актуальностью, совместимостью, безопасностью...

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Да и вообще SixLabors.ImageSharp он не под NET Framework а NET Core.
Вообще-то там .NET Standard 1.3 судя по описанию, который поддерживается в .NET Framework 4.6+ и других реализациях.
https://github.com/SixLabors/I... csproj#L13
https://docs.microsoft.com/en-... on-support
0
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
08.08.2020, 12:43 13
Setpixel и getpixel - очень медленные методы. Используйте LockBits. Вы сможете работать с пикселями как с массивом байт
https://docs.microsoft.com/ru-... at-ext-3.1
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
08.08.2020, 13:01  [ТС] 14
Цитата Сообщение от Toros1992 Посмотреть сообщение
Setpixel и getpixel - очень медленные методы. Используйте LockBits. Вы сможете работать с пикселями как с массивом байт
https://docs.microsoft.com/ru-... at-ext-3.1
Да блин. А это что:
https://www.codeproject.com/Ti... n-Csharp-3
Это и есть LockBits но это тоже медленно. Картинка большая.

Добавлено через 1 минуту
Цитата Сообщение от Someone007 Посмотреть сообщение
Вообще-то там .NET Standard 1.3 судя по описанию, который поддерживается в .NET Framework 4.6+ и других реализациях.
В любом случае важно NET 4.0 и все.
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
08.08.2020, 13:01 15
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Предположу что NET Core не поддерживает ничего кроме 10 но точно не знаю.
Ну вот не знаете, а пишите... Поддерживается Windows: 7 SP1+, 8.1, Win10 Version 1607+, Nano Server Version 1803+, Server 2012 R2+, а так же Mac OS и Linux.
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Но знаю 100 процентов что туда до сих пор не завезли конструктора WinForms
И тут мимо, конструктор давно есть.
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
08.08.2020, 13:13  [ТС] 16
Цитата Сообщение от Someone007 Посмотреть сообщение
И тут мимо, конструктор давно есть.
Из коробки в Visual Studio Net Core колнструктора нету. Его нужно подключать отдельно. Да и для меня удобнее Net Framework тем более я же сказал важно NET Framework 4.0. Еслиб только для скебя то юзал бы 4.7 так как в 10 он встроен но видители другим лень ставить NET Framework к томмуже много кто из теой аудитории до сихор на Windows xp сидят. Ей богу не надо пытаться меня переубедить. Вообщебы с радостью бы без NET Framework писал к примерору на Delphi да вот тока для этой утилиты 1 очень важный компонент написан на C# и переписывать на Delphi займет умй времени. Но вижу тут мне не дадут пример быстрой реализаци. Помимо замена цвета еще есть 3 оставшихся пункта.
1. Накладывание одной картинки на другую.
2. Отрисовка нескольких картинок в нужных позициях. Именно что не 1 картинка а несколько.
4. Изменение маштаба картинки / картинок

Изменение маштаба тоже хз как реализовывать но в принципе с 4 пунктом это не основное. Основное это замена цветов.
Повторяю пример:
Картинка:
https://yadi.sk/i/PjzRgG2MZINljA
И цвета:
#FFDA91 заменить на #0048FF
#DAB66D заменить на #0048DA
#B69148 заменить на #0048B6
#916D24 заменить на #004891
#6D4800 заменить на #00246D
#482424 заменить на #002448
#240000 заменить на #000024
0
Пора на C++?
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
08.08.2020, 13:29 17
Alexandr_7, пишите на Сях Плюс Плюсовских и импортируйте через DllImport.
0
46 / 20 / 5
Регистрация: 29.12.2015
Сообщений: 1,814
08.08.2020, 13:43  [ТС] 18
Цитата Сообщение от TrickyBestia Посмотреть сообщение
Alexandr_7, пишите на Сях Плюс Плюсовских и импортируйте через DllImport.
Я же сказал у меня для утилиты компоненты написаны на C# так что нет. Не вариант.

Может есть альтернативные пути быстрой обработки графике на NET 4.0. Или грапфический движок обертка над OpenGL но совместимой с WinForms. Знаю про ShareGL но как уже сказал инфы по замене цветов у картинки нет да и вообще если речь заходит про OpenGL то как работать с 2 d в ней там вообще инфы нет плюс это неудобная система координат.

Добавлено через 7 минут
Цитата Сообщение от Toros1992 Посмотреть сообщение
https://docs.microsoft.com/ru-... at-ext-3.1
Хотя может кто пример даст по замене цветов через LockBits. Может и ошибаюсь но мне казалась задержка в 2 секунды была. Повторюсь что да. Быстрее чем Setpixel и getpixel но задержка в 2 секунды это уже много. На уровни игр надо обработку делать.
0
Пора на C++?
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
08.08.2020, 13:47 19
Alexandr_7, я же не говорю вам про написание всего кода на плюсах. Вы можете написать дллку с несколькими функциями на плюсах и импортировать эти функции в ваш шарповский код.
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
08.08.2020, 13:49 20
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Из коробки в Visual Studio Net Core колнструктора нету.
Есть там всё...
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
но видители другим лень ставить NET Framework к томмуже много кто из теой аудитории до сихор на Windows xp сидят
Забейте на других. Если им нужен ваш софт, то обновятся и установят всё что нужно, никуда не денутся...


Ну и вообще ускорить проход по массиву пикселей можно например распараллелив обработку на несколько потоков.

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
1. Накладывание одной картинки на другую.
Чем DrawImage не устраивает?
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
2. Отрисовка нескольких картинок в нужных позициях. Именно что не 1 картинка а несколько.
Позициях чего? Но тоже думаю DrawImage...
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
4. Изменение маштаба картинки / картинок
Под масштабом имеется в виду размер чтоли? Или нужно просто уместить картинку куда-то?
0
08.08.2020, 13:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2020, 13:49
Помогаю со студенческими работами здесь

Уменьшить количество цветов картинки!
Добрые люди, как можно решить задачу! во всем интернете только одна страница с трезвым ответом,...

Обрезка списка цветов из картинки
День добрый. Стоит следующая задача, есть картинка, в ней кроме whitespace нужно удалить еще 215...

Замена цветов в картинке
Сразу извиняюсь за столь банальный вопрос. Суть в следующем: имеется файл формата .png в котором...

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

Замена цветов избражения
Как изменить цвета изображения на наиболее схожие с ними цвета из массива?

удалить один из цветов (пикселей) с картинки
теперь возник другой вопрос.....как мне удалить один из цветов или один из пикселей с картинки,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru