Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
1

Получить цвет пикселя

01.11.2013, 00:09. Показов 2975. Ответов 5
Метки нет (Все метки)

Имеется указатель на массив битов, полученный, например, функцией GetDIBits. Собственно вопрос: как из этого массива получить RGB пикселя с координатами x, y? Вариант с использованием StretchDIBits, а потом GetPixel не подойдет. Уж слишком медленный.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.11.2013, 00:09
Ответы с готовыми решениями:

Как получить цвет пикселя?
Его координаты у меня есть

Получить цвет пикселя из неактивного окна, перекрытого другими окнами окна
Можно ли получить цвет пикселя из неактивного или перекрытого другими окна? Какие есть способы?...

Вытащить цвет пикселя из битмапа
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); int nScreenHeight =...

Цвет пикселя HBITMAP по координатам
Есть HBITMAP . Как узнать цвет пикселя в формате RGB для координат X , Y. Можно пример кода...

5
3 / 0 / 0
Регистрация: 01.11.2013
Сообщений: 3
01.11.2013, 01:05 2
Насколько помню, байты цвета в буфере идут так (полагаю глубину цвета 24 бита = 3 байта - rgb):
rgbrgbrgb...xx
rgbrgbrgb...xx
rgbrgbrgb...xx
rgbrgbrgb...xx

где xx - несколько "мусорных" байтов, для кратности 4 длины строки в байтах.
Т.е. адрес пикселя будет:

byte * pixel = buffer + y * stride + x * 3; // R=pixel[0], G=pixel[1], B=pixel[2] , хотя R и B могут быть наоборот - не помню точно.
где stide - кол-во байт в строке изображения (кратное 4)
stride = (width * 3 + 3) & (~0x3); // небольшая магия по доводке до числа до большего, кратного 4.

width - ширина, берется из BITMAPINFO.BITMAPCOREHEADER.bcWidth (там же другие параметры изображения).

Еще: если не ошибаюсь в памяти картинка может быть зеркально отражена по вертикали (ох уж эти виндовские оптимизации) - это вроде можно проверять по отрицательности/положительности BITMAPINFO.BITMAPCOREHEADER.bcHeight..
0
Модератор
Эксперт по электронике
8488 / 6315 / 854
Регистрация: 14.02.2011
Сообщений: 21,882
01.11.2013, 01:15 3
GetPixel()
http://msdn.microsoft.com/en-u... s.85).aspx

Добавлено через 6 минут
Цитата Сообщение от FreeMan108 Посмотреть сообщение
Собственно вопрос: как из этого массива получить RGB пикселя с координатами x, y?
собственно а ты уверен что там лежит RGB? а не RGBA? там вполне могут лежать и индексы палитры
потому и GetPixel() медленный что учитывает все варианты
если знаешь формат изображения и размеры то считай смешение и считывай
смешение равно размер строки * координаты по вертикали+ координаты по горизонталь и все это умножить на количество байтов которые занимает пиксел
1
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
01.11.2013, 01:39  [ТС] 4
Всем спасибо. Все работает отлично.
Да кст. только что протестировал, байты RGB действительно идут в обратном порядке и изображение повернуто на 180. Хотя не понятно зачем надо было так извращать картинку.
0
Модератор
Эксперт по электронике
8488 / 6315 / 854
Регистрация: 14.02.2011
Сообщений: 21,882
01.11.2013, 08:40 5
Цитата Сообщение от FreeMan108 Посмотреть сообщение
RGB действительно идут в обратном порядке
порядок никто не нормировал
при том что COLORREF прекрасно умещается в int ( а там обратный счет байтов)
ты еще не столкнулся с кодировкой 5-5-5 или 5-6-5 когда цвет пикселя кодировался 2мя байтами
Цитата Сообщение от FreeMan108 Посмотреть сообщение
и изображение повернуто на 180.
,
не повернуто на 180, лево с право не попутаны, а зеркальное отражение , осевая симметрия
и причем все правильно
Мы настолько привыкли к компьютерному изврату, ось игрек с верху вниз идет, что уже нормальное видение нас удивляет
а у нормальных людей, ось снизу вверх, и получается что строка с меньшим номером находится ниже
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
01.11.2013, 14:59  [ТС] 6
Цитата Сообщение от ValeryS Посмотреть сообщение
не повернуто на 180, лево с право не попутаны, а зеркальное отражение , осевая симметрия
и причем все правильно
Вот как раз при повороте на 180, зеркально отображаются верхняя и нижняя части. Имеется ввиду, что картинка поворачивается не по часовой стрелке, а в пространстве вокруг своей горизонтальной оси, что и делает осевую симметрию.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.11.2013, 14:59

Нужно найти цвет пикселя
Здравствуй, читающий HDC dc = GetDC(NULL); color = GetPixel(dc, 641, 481); ReleaseDC(NULL,...

GetPixel неправильно определяет цвет пикселя
Господа такая ситуация - я нарисовал в своём окне линию красного цвета , затем при помощи GetPixel...

Возможно ли без помощи GDI изменить цвет пикселя
Возможно ли без помощи Graphics Device Interface изменить цвет, установить пиксель и рисовать?

Значение первого бита в файле преобразовать в цвет пикселя
Если создал не в том разделе, прошу перенести в нужный. Спасибо, простите! Я не знаю как задать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.