Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для smay
3 / 3 / 5
Регистрация: 07.12.2013
Сообщений: 189

Замена одного цвета на другой в картинке

17.12.2013, 22:37. Показов 2084. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Вообщем, хочу сделать программу, которая будет заменять цвет пикселей на картинке. К примеру, я загружаю картинку в PictureBox - серый треугольник. Указываю в TextBox'e1 его цвет, в TextBox'e2, цвет на который хочу заменить. Нажимаю кнопочку, и цвет заменяется. Как это можно сделать? Желательно с пояснениями и попроще ^_^
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2013, 22:37
Ответы с готовыми решениями:

Рисунок на форме (использование Paint) - замена одного цвета на другой
Подскажите на форме в Paint нарисована схема квадраты круги заслонки и тд задан цвет в ходе выполнения программы нужно чтобы квадраты...

Замена цвета на картинке
Как заменить цвет на картинке на цвет,который передала некая функция MyFilter,принимающая цвет,и отдающая обработанный цвет Такой...

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

7
5 / 5 / 2
Регистрация: 25.08.2013
Сообщений: 39
19.12.2013, 22:21
Могу посоветовать использовать класс Graphics.
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
23.12.2013, 13:52
Цитата Сообщение от alekla Посмотреть сообщение
Могу посоветовать использовать класс Graphics.
Лучше не надо...

Цитата Сообщение от smay Посмотреть сообщение
Замена одного цвета на другой в картинке
Использовать методы LockBits, Scan0, UnlockBits и работать с байтовым массивом, представляющим картинку.

Цитата Сообщение от smay Посмотреть сообщение
Желательно попроще
Использовать методы GetPixel и SetPixel. Работать будет, но медленно.
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
24.12.2013, 03:01
Лучший ответ Сообщение было отмечено как решение

Решение

Qwertiy, блин, я принял Ваш ответ за уточнение ТС

И сижу с этими Маршалами.

Ладно, набросал, правда без комментариев, принцип сам плохо понимаю у этих LockBits...
Проект в 2008


Не по теме:

Я еще думаю, ниче себе, ТС заговорил какими фразами, на кого ж он там учится?
Перепутал так перепутал.



Код
VB.NET
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
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices
 
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim bmp As New Bitmap("C:\Пример.png")
        PictureBox1.BackgroundImage = New Bitmap(bmp)
        Dim pxf As PixelFormat = PixelFormat.Format32bppArgb
 
        Dim rect As Rectangle = New Rectangle(0, 0, bmp.Width, bmp.Height)
        Dim bmpData As BitmapData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf)
 
        Dim ptr As IntPtr = bmpData.Scan0
 
        Dim numBytes As Integer = bmpData.Stride * bmp.Height
        Dim rgbValues(numBytes) As Byte
 
        Marshal.Copy(ptr, rgbValues, 0, numBytes)
        Dim Startcol As Color = Button2.BackColor
        Dim ResColor As Color = Button3.BackColor
        For counter As Integer = 0 To rgbValues.Length - 4 Step 4
            If CInt(rgbValues(counter + 2)) = Startcol.R And CInt(rgbValues(counter + 1)) = Startcol.G And CInt(rgbValues(counter + 0)) = Startcol.B Then
                rgbValues(counter + 2) = ResColor.R
                rgbValues(counter + 1) = ResColor.G
                rgbValues(counter) = ResColor.B
            End If
        Next counter
 
        Marshal.Copy(rgbValues, 0, ptr, numBytes)
        bmp.UnlockBits(bmpData)
        PictureBox2.BackgroundImage = bmp
    End Sub
 
    Private Sub Button2_Click(ByVal sender As Button, ByVal e As System.EventArgs) Handles Button2.Click, Button3.Click
        Dim CD As New ColorDialog
        If CD.ShowDialog = Windows.Forms.DialogResult.OK Then
            sender.BackColor = CD.Color
        End If
    End Sub
End Class




Вложения
Тип файла: rar Замена цвета.rar (106.9 Кб, 24 просмотров)
5
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
24.12.2013, 17:32
Цитата Сообщение от Памирыч Посмотреть сообщение
Перепутал так перепутал.



Цитата Сообщение от Памирыч Посмотреть сообщение
Ладно, набросал, правда без комментариев, принцип сам плохо понимаю у этих LockBits...
Зато разобрался, как оно работает

Цитата Сообщение от Памирыч Посмотреть сообщение
Код
В принципе нормально.
Я бы вынес в отдельную функцию для замены цвета и использовал int'ы, а не байты, раз уж всё равно 4-байтовый формат с альфаканалом. Кстати, использование фиксированного цветового формата может само по себе внести искажения. Но писать под каждый действительно смыска никакого. Не думаю, что где-то реально нужно больше 32 бит на цет.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  Public Shared Sub ReplaceColor(ByVal Bmp As Bitmap, ByVal OldColor As Color, ByVal NewColor As Color, Optional ByVal IgnoreAlpha As Boolean = False)
    Dim BmpData As BitmapData = Bmp.LockBits(New Rectangle(Nothing, Bmp.Size), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb)
    Dim ArgbData(BmpData.Stride * BmpData.Height / 4 - 1) As Integer
    Dim Mask As Integer = If(IgnoreAlpha, (1 << 24) - 1, -1), NotMask As Integer = Not Mask
    Dim OldVal As Integer = ((((((CInt(OldColor.A) << 8) Or OldColor.R) << 8) Or OldColor.G) << 8) Or OldColor.B) And Mask
    Dim NewVal As Integer = ((((((CInt(NewColor.A) << 8) Or NewColor.R) << 8) Or NewColor.G) << 8) Or NewColor.B) And Mask
 
    Marshal.Copy(BmpData.Scan0, ArgbData, 0, ArgbData.Length)
 
    For Q As Integer = 0 To ArgbData.Length - 1
      If (ArgbData(Q) And Mask) = OldVal Then ArgbData(Q) = (ArgbData(Q) And NotMask) Or NewVal
    Next Q
 
    Marshal.Copy(ArgbData, 0, BmpData.Scan0, ArgbData.Length)
    Bmp.UnlockBits(BmpData)
  End Sub
Добавлено через 6 минут
Цитата Сообщение от Qwertiy Посмотреть сообщение
New Rectangle(Nothing, Bmp.Size)
Эм.. На самом деле New Point(0, 0). Просто это одно и то же с Nothing, поскольку Point - это структура, а не класс.

Добавлено через 1 минуту
Использование:
VB.NET
1
2
3
4
    Dim Bmp As New Bitmap(Filename)
    PictureBox1.Image = Bmp.Clone()
    ReplaceColor(Bmp, Color.Red, Color.Green, True)
    PictureBox2.Image = Bmp
Добавлено через 1 минуту
Кстати, я бы скорее всего сделал метод, возвращающий само Bmp. Просто сейчас не стал так делать, чтобы не создавать ощущение, что передаваемый не изменяется.
1
24.12.2013, 17:45

Не по теме:

Цитата Сообщение от Qwertiy Посмотреть сообщение
раз уж всё равно 4-байтовый формат с альфаканалом
Я поначалу со жпегами начал, но мне не понравилось это дело. Границы фигур словно "обмороженные".
А если качество жпега еще и совсем неважное, я посчитал, что игра не стоит свеч.

0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
24.12.2013, 17:52
Цитата Сообщение от Памирыч Посмотреть сообщение
Я поначалу со жпегами начал, но мне не понравилось это дело. Границы фигур словно "обмороженные".
Ага, у jpeg'ов печалько с контурами...
Правда, если png с градиетнами будет или изменением прозрачности поверх других объектов - то тоже.

Цитата Сообщение от Памирыч Посмотреть сообщение
А если качество жпега еще и совсем неважное, я посчитал, что игра не стоит свеч
Не понял. Как вообще jpeg связан с использованием интов или байтов? Это же на результат замены не влияет.
Кстати, забыл в прошлый раз - у тебя лишний байт в массиве.

Добавлено через 1 минуту
Да, я тут подумал - можно в моём варианте использовать маску для замены похожих цветов, правда не пробовал, что из этого выйдет.
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
24.12.2013, 18:00
Цитата Сообщение от Qwertiy Посмотреть сообщение
Это же на результат замены не влияет
Это влияет на получение адекватных данных

Добавлено через 1 минуту
Цитата Сообщение от Qwertiy Посмотреть сообщение
маску для замены похожих цветов, правда не пробовал, что из этого выйдет
Я пробовал использовать разброс на десяточку, по мне так неплохо, жпеги обрабатывает лучше, но края все равно
Цитата Сообщение от Qwertiy Посмотреть сообщение
печалько
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2013, 18:00
Помогаю со студенческими работами здесь

Множественная замена цвета на картинке
Здравствуйте, столкнулся с задачей замены ОДНОГО И ТОГОЖЕ цвета на картинке на множество вариантов (ок. 500) каждый вариант нужно сохранять...

Передача цвета из одного WPF окна на другой
Честно говоря, заголовок не передаёт всю суть моей проблемы. У меня есть главное WPF окно, на котором присутствуют 3 объекта Slider для...

Изменение цвета фона одного объекта при наведении на другой
Доброго времени суток. Столкнулся с проблемой которую никак не получается решить. Создал навигацию с выпадающими меню, в котором...

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

Замена одного тега на другой
в общем такая проблема в зависимости от ситуации нужно тег &lt;a&gt;&lt;/a&gt; заменять на &lt;span&gt;&lt;/span&gt; но нужно понимать что внутри...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru