powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как вычислить "средний цвет картинки"?
8 сообщений из 8, страница 1 из 1
А как вычислить "средний цвет картинки"?
    #38409177
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть форма, на нее кладем картинку (произвольную).
Надо к картинке нарисовать "шапку" -типа заголовок формы.
При этом шапка должна попасть "в тон" картинке - лучше если верхней части,
и при этом быть темной (т.е. на ней расположен белый шрифт и белый крест - кнопка закрыть).

Вариант #1:
Код: vbnet
1.
PictureBox2.BackColor =bmp_Background.GetPixel(0, 0)


Вариант #2
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      For x As Integer = 0 To bmp_Background.Width - 1
        For y As Integer = 150 To bmp_Background.Height - 1
          pix_color.argb_color = bmp_Background.GetPixel(x, y).ToArgb
          sumalpha += pix_color.Alpha
          sumred += pix_color.Red
          sumgreen += pix_color.Green
          sumblue += pix_color.Blue
          k += 1
        Next y
      Next x
      Dim new_color As Color =
      Color.FromArgb(sumalpha / k, sumred / k, sumgreen / k, sumblue / k)
      PictureBox2.BackColor = new_color



Ну или например то же что выше - среднее от верхней полосы заданной ширины - высоты.

Задница в чем, если верхний правый пиксель темный и тон верхней части картинки более менее одинаковый, то хватит этого пикселя. Т.е. цвет шапки должен быть "темным". Если сверху белое-бледное, то цвет надо брать пониже (наверное).
Здесь скорее не код нужен, а идея как придумать такой подходящий цвет из произвольной картинки (алгоритм?).
Есть какая-нибудь теория по этому делу?
...
Рейтинг: 0 / 0
А как вычислить "средний цвет картинки"?
    #38409185
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Есть какая-нибудь теория по этому делу?
конечно. Уйти нужно от цветовой модели RGB

например HSB - цветовой тон (hue), насыщенность (saturation), яркость (brightness).
...
Рейтинг: 0 / 0
А как вычислить "средний цвет картинки"?
    #38409189
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77For x
For y
GetPixel(0, 0)

за это можно покалечить.
это работает очень долго. быстрее перегнать в массив байт, в BMP формат и с ним играться. как это будет на VB не знаю.
схема какая то такая: картинка->стрим->массив байт
правда , если скорость не жмёт...

по теме. присвоить вес пикселям. те что ближе к краю те имеют больший вес.
+использовать градиент
...
Рейтинг: 0 / 0
А как вычислить "средний цвет картинки"?
    #38410219
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erДмитрий77For x
For y
GetPixel(0, 0)

за это можно покалечить.
это работает очень долго. быстрее перегнать в массив байт, в BMP формат и с ним играться. как это будет на VB не знаю.
схема какая то такая: картинка->стрим->массив байт
правда , если скорость не жмёт...

по теме. присвоить вес пикселям. те что ближе к краю те имеют больший вес.
+использовать градиент
На самом деле у меня
Код: vbnet
1.
GdipExec(GdipCreateBitmapFromFile(StrPtr(the_filename), bmp_Background))


и при необходимости
Код: vbnet
1.
2.
      GdipExec GdipCreateHBITMAPFromBitmap(bmp_Background, hBitmap, 0)
      Set CreateHbmpBackground = CreateIPictureDispFromHBITMAP(hBitmap)


и сделать это на VB6, но
Net.Graphics == Gdi+ Graphics, но т.к. я запостил на .Net то и пример кода на .Net

По поводу скорости - ерунда.
Картинка ~400х400 px, делается один раз при загрузке картинки,
либо вообще при выборе картинки и цвет запоминается независимо.

Даже for x,y для всей картинки делается очень быстро.

Градиентов не нужно, нужен один цвет.

ИзопропилДмитрий77Есть какая-нибудь теория по этому делу?
конечно. Уйти нужно от цветовой модели RGB

например HSB - цветовой тон (hue), насыщенность (saturation), яркость (brightness).
Да надо как-то по-простому сделать, чем RGB не катит?
В твоем случае нужны примеры реализации, RGB хотя б понятно как вытаскивать.

Я попробую пояснить на картинке. В "хорошем случае" -достаточно левого верхнего пикселя, в "плохом" - взято среднее по верхней скан-линии (а по хорошему надо б взять преобладающий цвет элементов темного поезда). Под "шапкой" будет полоса белой подложки -наложенная белая полупрозрачная картинка (примерно воспроизвел), поэтому "сливание" шапки с верхним фоном не страшно.
...
Рейтинг: 0 / 0
А как вычислить "средний цвет картинки"?
    #38410229
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Да надо как-то по-простому сделать, чем RGB не катит?

HSV - это и есть по-простому. Почитай теорию и практику о цветовых пространствах,
формулы перевода - простые.
...
Рейтинг: 0 / 0
А как вычислить "средний цвет картинки"?
    #38410271
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
А как вычислить "средний цвет картинки"?
    #38410347
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

как ты наверно понял, я пытаюсь допилить твою идею, кстати письмо то крайнее получил (просто не отвечаешь)?

Да как то проще надо, а то там звезды какие-то.
М.б. как-то "убрать белый" (Как?)
А потом вычислить "средний цвет" (без белого)?

Плохо то что я не могу (алгоритмом) сформулировать то чего хочу (для произвольной картинки).
Т.е. цвет шапки должен быть не "кукареку" относит. картинки и при этом не сливаться с белым. Желательно чтоб он "сливался" с верхней левой частью картинки. Но при этом и не быть случайным.

Приоритеты:
1) Верхняя левая часть (не "белый") - но при условии что это не случайный пиксель (например железнодорожный столб), а соответствует примерно соседним - темное небо хороший пример.
2) Верхняя часть (не "белый")
3) Преобладающий цвет (с какой-то точностью) (не "белый")

Для картинки с поездом первые 2 варианта не прокатывают, доминирующий цвет - темные окна поезда (на мой взгляд).
...
Рейтинг: 0 / 0
А как вычислить "средний цвет картинки"?
    #38410519
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в принципе вот такая "фигня" дает неплохие результаты.
Я ограничил выбор цветов "не слишком светлый" -"не слишком темный" (скажу честно - от балды)
Код: vbnet
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.
      Dim list As New Dictionary(Of Integer, Integer)
      For x As Integer = 0 To bmp_Background.Width - 1
        For y As Integer = 0 To bmp_Background.Height - 1
          Dim rgb As Integer = bmp_Background.GetPixel(x, y).ToArgb()
          If (rgb > -15000000) And (rgb < -8000000) Then

            Dim added As Boolean = False
            For i As Integer = 0 To 10
              If list.ContainsKey(rgb + i) Then
                list(rgb + i) += 1
                added = True
                Exit For
              End If
              If list.ContainsKey(rgb - i) Then
                list(rgb - i) += 1
                added = True
                Exit For
              End If
            Next i
            If added = False Then list.Add(rgb, 1)
          End If
        Next y
      Next x

      Dim maxV As Integer = 0
      Dim new_color As Color
      For Each element In list
        If element.Value > maxV Then
          maxV = element.Value
          new_color = Color.FromArgb(element.Key)
        End If
      Next
      'MsgBox(new_color.ToArgb)
      Label1.BackColor = new_color
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как вычислить "средний цвет картинки"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]