Мониторинг обменных курсов валют
18c0693f

Как узнать цвет точки на фотографии


GetPixel и свойства R, G, B.   Задача: У вас есть фотография морского пляжа и вы хотите узнать, какого цвета зонтик вот у этой дамы слева.

Решение: Сначала вы заносите фото в компьютер и создаете объект Bitmap с этим фото. Затем, чтобы не было разницы между пикселями экрана и пикселями объекта, создаете еще один объект Bitmap с заданными размерами, как мы это делали в 12.3.4. Для наглядности нарисуйте это фото на форме. Затем вам нужно узнать координаты хоть какой-нибудь точки на зонтике. Я думаю, вы сами догадаетесь, как это сделать. Совершенно верно, методом «тыка». Здесь вам поможет маленькая окружность, которую  вы рисуете на фото и координаты которой вы наугад подбираете так, чтобы попасть в зонтик. Как только вы увидите, что окружность оказалась прямо на зонтике, можно приступать к определению цвета в ее центре. Для этого вы используете функцию  GetPixel объекта Bitmap и свойства R, G, B структуры Color:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim Гр As Graphics = Me.CreateGraphics

        Dim Фото As New Bitmap("Spacescape.JPG")

        Dim Фото1 As New Bitmap(Фото, 500, 400)

        Dim Цвет_точки As Color

        Dim x, y, Красный, Зеленый, Синий As Integer

        Гр.DrawImage(Фото1, 0, 0)

        x = InputBox("Введите горизонтальную координату точки")

        y = InputBox("Введите вертикальную координату точки")

        Гр.DrawEllipse(New Pen(Color.Yellow, 3), x - 5, y - 5, 10, 10)     'Рисуем маленькую окружность

        Цвет_точки = Фото1.GetPixel(x, y)      'Определяем  цвет заданной точки

        Красный = Цвет_точки.R                     'Количество красного

        Зеленый = Цвет_точки.G                     'Количество зеленого

        Синий = Цвет_точки.B                         'Количество синего

        Debug.WriteLine(Цвет_точки)

        Debug.WriteLine(Красный)

        Debug.WriteLine(Зеленый)

        Debug.WriteLine(Синий)


End Sub
Пояснения: Функция  GetPixel
объекта Bitmap определяет цвет пикселя с заданными координатами в объекте Bitmap. Она возвращает значение типа Color. Свойства R, G, B структуры Color являются целыми числами в диапазоне 0-255 и имеют значение количества в ней красного, зеленого и синего цвета.
Программа выдаст результаты такого вида:
Color [A=255, R=209, G=183, B=98]
209
183
98
Вам придется удовлетвориться тем, что вы узнаете содержание основных цветов в нужной точке рисунка. Имейте в виду, что программа находит цвет одной точки на зонтике, а не всего зонтика. Если зонтик хоть чуть-чуть пестрый, разные точки на зонтике имеют разный цвет и результат будет дезориентирующим. Часто пестрый узор настолько мелок, что издалека он кажется вам однородным цветом, и лишь большое увеличение позволяет обнаружить пестроту.
У структуры Color имеется также свойство A, определяющее прозрачность в том смысле, о котором мы только что говорили.
SetPixel.  Вы можете не только узнавать цвет пикселя, но и рисовать в любом месте объекта Bitmap пиксель нужного цвета. Для этого вы используете функцию  SetPixel объекта Bitmap. Так, в условиях предыдущей задачи оператор
                Фото1.SetPixel(x, y, Color.Blue)
поставил бы синюю точку в центр окружности. Только не забывайте после этого нарисовать содержимое объекта на экране, а то вы эту точку не увидите.
Вот фрагмент, рисующий на фотографии синий треугольник из пикселей:
        x0 = InputBox("Введите горизонтальную координату точки")
        y0 = InputBox("Введите вертикальную координату точки")
        For y = y0 To y0 + 100
            For x = x0 To y
                Фото1.SetPixel(x, y, Color.Blue)
            Next
        Next
        Гр.DrawImage(Фото1, 0, 0)
Задание 74.          
Определить цвет заданной точки на картинке и выдать одно из трех сообщений: