purebasic.info

PureBasic forum
Текущее время: Чт июл 19, 2018 1:01 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: определение цвета пиксела (Win32API)
СообщениеДобавлено: Сб янв 13, 2007 1:00 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 931
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
Есть такой код:

Код:
1
2
3
4
5
6
*DC=GetDC_(GetDesktopWindow_())
color=GetPixel_(*DC, x, y)
red=Red(color)
green=Green(color)
blue=Blue(color)
MessageRequester("", "R="+Str(red)+" G="+Str(green)+" B="+Str(blue))


(спасибо rAmpArk :D )

но он почему-то всегда при любом значении x и y выдает следующее:

Код:
1
R=255 G=255 B=255



может кто нибудь знает в чем тут проблема? :?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 13, 2007 9:24 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6322
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
На первый взгляд имена переменных совпадают со служебными словами.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 13, 2007 1:45 pm 
Не в сети
ассистент
Аватар пользователя

Зарегистрирован: Вс дек 03, 2006 6:27 pm
Сообщений: 20
Откуда: Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Может кривые x y?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 13, 2007 1:53 pm 
Не в сети
ассистент
Аватар пользователя

Зарегистрирован: Вс дек 03, 2006 6:27 pm
Сообщений: 20
Откуда: Питер
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Хотя нет.
Впринципе если ты захочешь использовать color в API то тебе не надо знать его RGB состовляющие. А вообще попробуй так:
Код:
1
2
3
4
5
6
*DC=GetDC_(GetCapture_()) 
color=GetPixel_(*DC, x, y)
red=Red(color)
green=Green(color)
blue=Blue(color)
MessageRequester("", "R="+Str(red)+" G="+Str(green)+" B="+Str(blue))



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 13, 2007 2:42 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 931
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 12 раз.
Пункты репутации: 15
Код:
1
2
*DC=GetDC_(GetCapture_())
color=GetPixel_(*DC, x, y)



Спасибо! Так заработало


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 13, 2007 7:57 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6322
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
Вот ещё один рабочий код:

Код:
1
2
3
4
5
6
Repeat
dc=CreateDC_("DISPLAY",0,0,0) : GetCursorPos_(mouse.POINT)
p=GetPixel_(dc,mouse\x,mouse\y) : DeleteDC_(dc)
Debug "R="+Str(Red(p))+", G="+Str(Green(p))+", B="+Str(Blue(p))
Delay (500)
ForEver



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 16, 2011 6:25 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Поскажите как поступить, если мне нужно найти пиксель указанного цвета в области экрана например 300х200, причем сделать это практически мгновенно?
Можно ли какимто макаром использовать DrawingBuffer() для определения цвета пикселя?
Цитата:
DrawingBuffer() Возвращает адрес видеопамяти. Эта функция работает непосредственно с видеопамятью, что позволяет используя ScreenOutput() или SpriteOutput() очень быстро манипулировать пикселами. ImageOutput() эта команда открывает прямой доступ к пикселям изображения.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 17, 2011 9:12 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Знаю что для переноса пикселей из видео памяти в оперативку есть апишка GetDIBits. Хотя не скажу что мгновенно всё происходит. Ну думаю в 100мс уложишься. Кстати если получиться у тебя это сделать без BitBlt. Или иным более быстрым способом. Напиши. Меня этот вопрос тоже интересует.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 17, 2011 9:45 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Через DrawingBuffer() получилось выдрать только для полноэкранного режима. Как захватить подобным образом рабочий стол к примеру. Не знаю

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 17, 2011 2:01 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Lunatic писал(а):
Как захватить подобным образом рабочий стол к примеру. Не знаю
Самый простой способ - сделать скрин экрана, но не думаю что это самый быстрый способ.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 18, 2011 10:21 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Самый простой способ - сделать скрин экрана, но не думаю что это самый быстрый способ.

Ну эта проблема какраз и решается. Сделать скрин и найти в нём пиксель, оптимальным способом.
Вообщем я тут пока покопался. Если нужно заполучить область экрана в полноэкранном режиме. Тогда использовать DrawingBuffer(). Если получить область в оконном режиме то через API вышеуказанные. Но не через GetPixel он тормозной до ужаса.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 18, 2011 12:58 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Lunatic
Цитата:
Если нужно заполучить область экрана в полноэкранном режиме. Тогда использовать DrawingBuffer().

А можно пример кода?
Из полноэкранного режима любого приложения?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 21, 2011 11:15 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Наткнулся на интересную статью:
Поставить точку... Быстрый доступ к пикселам TBitmap
там реализация быстрого доступа к пикселям через Делфи+АСМ:
Цитата:
В приложенном модуле некоторая оптимизация ассемблерного кода методов Get** и Set** класса TQuickPixels позволила повысить скорость работы примерно в 2 раза по сравнению с вариантом на Паскале - от 25 до 80 миллионов пикселов в секунду (в зависимости от цветового режима) на компьютере c процессором P3-600 МГц (10-20 процессорных тактов на точку), что примерно на два порядка быстрее, чем при использовании TCanvas.Pixels. Для режимов с палитрой скорость при выводе разных цветов, естественно, сильно падает. Отметим, что для некоторых целей - например, для проведения геометрических преобразований - можно модифицировать код класса таким образом, чтобы не переводить значения в режимах 15 - 32 бит в TColor и обратно, копируя значение в формате хранения. Однако скорость доступа к пикселам настолько высока, что при выполнении любых дополнительных действий (например, аффинных преобразований) лимитировать скорость обработки, скорее всего, будут в основном именно эти дополнительные действия, а не чтение-запись пикселов.

Вот результаты теста быстродействия на указанном компьютере (режимы с палитрой - при задании одного цвета) в мегапикселах в секунду:

1 bpp Get : 39.08 MP/s
1 bpp GetIndx: 60.26 MP/s
4 bpp Get : 63.73 MP/s
4 bpp GetIndx: 82.63 MP/s
8 bpp Get : 76.07 MP/s
8 bpp GetIndx: 104.99 MP/s
15 bpp Get : 31.63 MP/s
16 bpp Get : 31.64 MP/s
24 bpp Get : 55.48 MP/s
32 bpp Get : 79.44 MP/s

1 bpp Set : 27.22 MP/s
1 bpp SetIndx: 29.54 MP/s
4 bpp Set : 28.14 MP/s
4 bpp SetIndx: 28.99 MP/s
8 bpp Set : 31.17 MP/s
8 bpp SetIndx: 36.81 MP/s
15 bpp Set : 31.58 MP/s
16 bpp Set : 33.22 MP/s
24 bpp Set : 33.90 MP/s
32 bpp Set : 41.20 MP/s


Вложения:
Комментарий к файлу: Исходники
qpix.zip [42.89 KiB]
Скачиваний: 175
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 21, 2011 8:26 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Сб окт 09, 2010 2:21 am
Сообщений: 326
Откуда: Киев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
EnableExplicit
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"",#PB_Screen_WaitSynchronization)
StartDrawing(ScreenOutput())
Define *vmem=DrawingBuffer()
StopDrawing()
Repeat
  ExamineKeyboard()
  Delay(5)
  ClearScreen($33FFAB)
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
ShowMemoryViewer(*vmem,100)
 



Это что касается DrawBuffer, не уважаю я Делфи. Но если суть правильно уловил, то этот метод хорош если существует чёткая палитра цветов и под неё идёт оптимизация а адрес памяти они вытягивают через TBitmapInfo. А вот как копируют не заметил. Не уж то через BitBlt

_________________
Win7 Enterprise x86 (PB 5.11)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт мар 02, 2017 1:40 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1639
Откуда: Алматы
Благодарил (а): 14 раз.
Поблагодарили: 45 раз.
Пункты репутации: 5
вопрос по этому цвету пикселя - в моем случае цветов на картинке может быть только 16 штук. определенные цвета. а при вставке изображение из пейнта - там могут быть другие цвета. вот как можно определить типа если цвет на картинке не соответствует одному из 16, то заменить его на самый ближайший. скажем у меня фиолетовый в палитре, а из пейнта пришел розовый. естествно фиолетовый и розовый ближе друг к другу, чем скажем зеленый и фиолетовый. вот как можно подобрать эти самые цвета?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB