0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 4
1

Заливка ограниченной области с затравкой

04.12.2016, 19:49. Показов 5551. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, с у меня замечательно работает программа с одним цветом, все прекрасно. Заливает фигуры так, как надо. Но как только я меняю цвет mycolor, то программа перестает работать, зацикливается, что делать? Сижу уже который час, не вижу ошибки. Помогите, пожалуйста, начинающему программисту.

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
Bitmap MyImage;
      Color mycolor=Color.Red;
      Stack<Pixel> pixels;
      Color border = Color.Black;
public void MainAlgoritm(int x_start,int y_start)
        {
            Pixel one = new Pixel(MyImage.GetPixel(x_start,y_start),x_start,y_start);
            pixels=new Stack<Pixel>();
            pixels.Push(one);
            Pixel two;
            while (pixels.Count!=0)
            {
                two = pixels.Pop();
                
                if (FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X, two.Y), mycolor) == false)
                { MyImage.SetPixel(two.X,two.Y,mycolor);  MessageBox.Show("workinggg"); }
                
                pictureBox1.Image = MyImage;
                
                if ((FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X + 1, two.Y), mycolor)==false)&& 
                    (FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X+1,two.Y),border)==false))
                {
                    pixels.Push(new Pixel(MyImage.GetPixel(two.X + 1, two.Y),two.X+1,two.Y));
                    
                }
 
                if ((FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X,two.Y+1),mycolor)==false) && 
                    (FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X,two.Y+1),border)==false))
                {
                    pixels.Push(new Pixel(MyImage.GetPixel(two.X, two.Y + 1),two.X,two.Y+1));
                   
                }
 
 
                if ((FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X-1, two.Y), mycolor) == false) &&
                    (FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X-1, two.Y), border) == false) )
                {
                    pixels.Push(new Pixel(MyImage.GetPixel(two.X-1, two.Y), two.X-1, two.Y));
                }
 
                if ((FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X, two.Y-1), mycolor) == false) &&
                    (FillInstrument.areColorValuesEqual(MyImage.GetPixel(two.X, two.Y-1),border) == false) )
                {
                    pixels.Push(new Pixel(MyImage.GetPixel(two.X, two.Y-1), two.X, two.Y-1));
                }
                MessageBox.Show(pixels.Count.ToString());
 
            }
            pictureBox1.Image = MyImage; 
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            mycolor = Color.Green;
            
        }
 
        
    }
    public static class FillInstrument
    {
    public static bool areColorValuesEqual(Color clr1, Color clr2)
        {
            return ((clr1.A == clr2.A)&&(clr1.R==clr2.R)&&(clr1.G==clr2.G)&&(clr1.B==clr2.B));
        }}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2016, 19:49
Ответы с готовыми решениями:

Заливка фигуры с затравкой
Доброго времени суток! Проблема такова: необходимо реализовать алгоритм заливки фигуры с затравкой....

Заливка области
Нет ли ни у кого примера кода с заливкой области в pictureBox ? Я загружаю картинку в pictureBox...

Заливка области, ограниченной линиями
Создаю редактор-блок схем. В нем учел возможность создания пользовательского блока: вылетает диалог...

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

6
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
05.12.2016, 04:27 2
Максим Пашков, у меня этот код работает. Скиньте весь проект.
0
0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 4
05.12.2016, 16:32  [ТС] 3
TopLayer, вот, пожалуйста. Кнопка меняет цвет кисти на зеленый.
Вложения
Тип файла: rar painting 2.rar (87.1 Кб, 158 просмотров)
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
05.12.2016, 17:12 4
Максим Пашков, на форуме уже есть готовый код для подобной заливки, вот, в частности, мой.
0
0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 4
05.12.2016, 17:30  [ТС] 5
EvilFromHell, спасибо.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
05.12.2016, 17:34 6
Лучший ответ Сообщение было отмечено Максим Пашков как решение

Решение

Максим Пашков, ошибка здесь:
C#
1
var bmp = new Bitmap(pic.Width, pic.Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
Вы задаёте формат изображения, при котором он не может хранить все пикселы (R,G,B), где RGB - целые числа от 0 до 255. Поэтому Bitmap.SetPixel устанавливает не точное значение mycolor, а наиболее близкое к нему, которое может быть представлено в данном формате.
используйте Format24bppRgb
1
0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 4
05.12.2016, 17:59  [ТС] 7
TopLayer, спасибо большое, Вы волшебник.
0
05.12.2016, 17:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2016, 17:59
Помогаю со студенческими работами здесь

FloodFil и заливка с затравкой
как выполнить заливку фигуры: void __fastcall TForm2::PaintBox1Click(TObject *Sender) {...

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

Построчная заливка с затравкой, зависает программа
здравствуйте. моя проблема такова, что я искал код для построчной заливки фигуры с затравкой, нашел...

Реализовать алгоритм заливки с затравкой выпуклой области
Если r=2, реализовать алгоритм заливки с затравкой выпуклой области.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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