Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2011, 14:04   #1
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
Восклицание Извлечение информации из GetPixel()

Для извлечения информации о каждом пикселе выбранной мной картинки использую следующий метод:

CImage image;
image.GetPixel(j,i);

И через двойной цикл for я вынимаю информацию о каждом пикселе картинки.

Мне падают (как возвращаемые значения GetPixel()) int'ы вида:

6172466
6041908
5520191
etc..

Вопрос в том как мне отсюда вынуть информацию в виде RGB. Видел такие алгоритмы по изъятию информации, но они для VisualBasic.

К примеру:


Код:
Dim colRed, colBlue, colGreen  As Integer
col = GetPixel(tmpDC, xPos, yPos)


colRed = (col And &HFF&)
colGreen = (col And &HFF00&) / &H100
colBlue = (col And &HFF0000) / &H10000
я хотел переделать под код СИ, но вот замена And... и сразу же следующий знак &.. меня смущает.

Если кто-то касался уже данного вопроса напишите пожалуйста как вынуть данные.

Спасибо!
metoflex вне форума Ответить с цитированием
Старый 13.07.2011, 14:20   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
To extract the individual values for the red, green, and blue components of a color value, use the GetRValue, GetGValue, and GetBValue macros, respectively.
Читаем доки, а не плодим сто раз описаные темы.
p51x вне форума Ответить с цитированием
Старый 13.07.2011, 14:27   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

metoflex, пиксель имеет 4 значения RGB + альфа канал, следовательно информацию можно извлечь как-то так (4 байта всего, каждому по значению):
Код:
<переменная для хранения оттенка> = (<переменная куда записано int> & <бинарное или hex-представление подобной последовательности>)
бинарное или hex-представление подобной последовательности - 00000000000000000000000011111111
Для автоматизации засуньте в цикл и поиграйте с побитовыми сдвигами (<</>>)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 13.07.2011, 14:30   #4
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Читаем доки, а не плодим сто раз описаные темы.
Скинь ссылку на доки, буду весьма благодарен!
metoflex вне форума Ответить с цитированием
Старый 13.07.2011, 14:32   #5
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от ImmortalAlexSan Посмотреть сообщение
metoflex, пиксель имеет 4 значения RGB + альфа канал, следовательно информацию можно извлечь как-то так (4 байта всего, каждому по значению):
Код:
<переменная для хранения оттенка> = (<переменная куда записано int> & <бинарное или hex-представление подобной последовательности>)
бинарное или hex-представление подобной последовательности - 00000000000000000000000011111111
Для автоматизации засуньте в цикл и поиграйте с побитовыми сдвигами (<</>>)
Ок Спасибо!

Мб еще кто-нибудь задавался вопросом по преобразованию RGB ( 8 8 8 ) в RGB (5 6 5). На эту тему тоже половину инета перелопатил, но четкого алгоритма так и не нашел.
Спасибо!
metoflex вне форума Ответить с цитированием
Старый 13.07.2011, 14:38   #6
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

metoflex, а вам обязательно GetPixel() нужно? Ведь есть метод ScanLine, - побыстрее будет. Плюс когда картинку в TBitmap храните, в свойствах TBitmap можно задать формат пиксела:
Код:
bmp->setpixelformat = <выбираете нужный вам формат (pf16bit, pf24bit, pf32bit, pf8bit)>
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 13.07.2011, 14:48   #7
metoflex
Пользователь
 
Регистрация: 21.06.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от ImmortalAlexSan Посмотреть сообщение
metoflex, а вам обязательно GetPixel() нужно? Ведь есть метод ScanLine, - побыстрее будет. Плюс когда картинку в TBitmap храните, в свойствах TBitmap можно задать формат пиксела:
Код:
bmp->setpixelformat = <выбираете нужный вам формат (pf16bit, pf24bit, pf32bit, pf8bit)>

Спасибо за совет! Я подумаю над этим.
metoflex вне форума Ответить с цитированием
Старый 13.07.2011, 19:02   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Я же указал строки из доков. Там указаны макросы, которые написаны и надо использовать.
p51x вне форума Ответить с цитированием
Старый 13.07.2011, 19:34   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
col = GetPixel(tmpDC, xPos, yPos)
colRed = (col And &HFF&)
colGreen = (col And &HFF00&) / &H100
colBlue = (col And &HFF0000) / &H10000

я хотел переделать под код СИ, но вот замена And... и сразу же следующий знак &.. меня смущает.
&H - в бейсике это префикс означающей 16-ричное представление записи числа.
буквальный перевод такой:
Код:
int colRed = (col & 0xFF);
int colGreen = (col & 0xFF00) / 0x100;
int colBlue = (col & 0xFF0000) / 0x10000;
Или так:
Код:
int colRed = (BYTE) col;
int colGreen =(BYTE)(((WORD)(col)) >> 8);
int colBlue = (BYTE)((col)>>16);
Что и делают макросы GetRValue...
EUGY вне форума Ответить с цитированием
Старый 14.07.2011, 22:34   #10
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Я не помню есть ли в c++ ScanLine, но в c# ScanLine нет, вместо него разработчики сделали что-то вроде этого:
Код:
System.Drawing.Imaging.BitmapData bitdata =
                bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, 
                bmp.PixelFormat);
            IntPtr ptr = bitdata.Scan0;
            int bytes = Math.Abs(bitdata.Stride) * bmp.Height;
            byte[] rgbValues = new byte[bytes];
            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
            label1.Text = System.Convert.ToString(trackBar1.Value);
            //BGR
            for (int i = 0; i < rgbValues.Length ; i += 3)
                rgbValues[i] = 255;
            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
            bmp.UnlockBits(bitdata);
тот же самый скан лайн, только вот так с ним надо работать.
Но вот так очень медленно тоже будет работать.
По этому чтобы уж совсем до сканлайна оптимизировать, рукомендую unsafe code использовать.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 14.07.2011 в 23:23.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос про getpixel Karyuudo Общие вопросы Delphi 7 16.01.2018 14:11
GetPixel,SetPixel Акоб Общие вопросы C/C++ 8 12.04.2011 16:33
не правильно работает GetPixel Yokka Общие вопросы .NET 2 17.02.2011 01:08
извлечение информации из текста Alejandr0 Microsoft Office Word 2 06.09.2010 14:23
Извлечение информации из JAVA приложения. bbFV Общие вопросы по Java, Java SE, Kotlin 3 28.05.2010 12:13