Autor Wątek: Winapi prędkosć funkcji GetPixel()  (Przeczytany 9180 razy)

Offline ArekBal

  • Użytkownik

# Grudzień 11, 2013, 20:48:34
5. Proszę, daj wątkowi trochę wytchnienia, jakimś chociażby sleep(0)


Cytuj
  int padding = 0;
    while ( (width * 3 + padding) % 4 != 0) padding++;

A może coś w ten deseń?
Kod: (cpp) [Zaznacz]
int padding = (4 - ((width * 3 + 4) % 4)) % 4;
« Ostatnia zmiana: Grudzień 11, 2013, 20:56:28 wysłana przez ArekBal »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline kolarz3

  • Użytkownik

# Grudzień 11, 2013, 20:55:38
Dobra, z pamięcią jest teraz w miarę OK. No ale nie zgadza mi się wynik z funkcją GetPixel().
#include <iostream>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#include <list>
using namespace std;
void czekaj( float sekundy )
{
    clock_t koniec_czekania;
    koniec_czekania = clock() + sekundy * CLOCKS_PER_SEC;
    while( clock() < koniec_czekania ) { }
}
int main()
{

while(GetAsyncKeyState(0x31)==0)
{
}
czekaj(0.5);

int r3=0;
    int width = GetSystemMetrics(SM_CXSCREEN);
    int height = GetSystemMetrics(SM_CYSCREEN);
int padding = 0;
    while ( (width * 3 + padding) % 4 != 0) padding++;
BITMAPINFO bmi;
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biHeight = height;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = 0;
    bmi.bmiHeader.biSizeImage = height * (width * 3 + padding);
    bmi.bmiHeader.biXPelsPerMeter = 0;
    bmi.bmiHeader.biYPelsPerMeter = 0;
    bmi.bmiHeader.biClrUsed = 0;
    bmi.bmiHeader.biClrImportant = 0;


COLORREF* pixel = new COLORREF [ width * height ];
HDC hdcSource ;
HDC hdcDest;
HBITMAP hbmOutput;
HBITMAP hbmOld;
int kolor;
int kolor2;
POINT p;
    hdcSource = GetDC(HWND_DESKTOP);
    hdcDest = CreateCompatibleDC(hdcSource);
    hbmOutput = CreateCompatibleBitmap(hdcSource,width,height);
    hbmOld = (HBITMAP)SelectObject(hdcDest,hbmOutput);
BitBlt(hdcDest,0,0,width,height,hdcSource,0,0,SRCCOPY);
COLORREF pixel2;
while(GetAsyncKeyState(0x31)==0)
{
GetCursorPos(&p);
r3++;
    GetDIBits(hdcDest,hbmOutput,0,height,pixel,&bmi,DIB_RGB_COLORS);
kolor=GetBValue(pixel[p.y*width+p.x]);

pixel2 = GetPixel( hdcSource, p.x, p.y );
kolor2=GetBValue(pixel2);
if(GetAsyncKeyState(0x35))cout<<kolor<<" "<<kolor2<<" X: "<<p.x<<" Y: "<<p.y<<endl;
}

cout<<r3;
system("PAUSE");

}

To z paddingiem nie pomaga.

P.S Zapisałem to bitmapę do pliku i jest git, nie wiem czemu źle wyświetla te piksele ...
« Ostatnia zmiana: Grudzień 11, 2013, 21:24:57 wysłana przez kolarz3 »

Offline Xirdus

  • Redaktor

# Grudzień 11, 2013, 21:52:02
Czy ty w ogóle przeczytałeś mojego posta? :|

Offline kolarz3

  • Użytkownik

# Grudzień 11, 2013, 22:50:18
Przecież wykonałem wszystkie polecenia ...

Już chyba ogranołem o co chodzi. Tekstura pobierana z pulpitu nie jest aktualizowana.

Mnie nie zrozumiano. Ja chcę stworzyć program który będzie cały czas pobierał bitmapę z pikselami i robił to jak najszybciej. Potrzebuje tylko 8 pikseli.
« Ostatnia zmiana: Grudzień 11, 2013, 23:15:31 wysłana przez kolarz3 »

Offline Xirdus

  • Redaktor

# Grudzień 12, 2013, 01:08:08
Przecież wykonałem wszystkie polecenia ...
Nie wykonałeś chociażby drugiego czy czwartego. A jeśli rzeczywiście jakimś cudem chodzi ci właśnie o wyciągnięcie samej składowej niebieskiej (w co wątpię), to powiedz co konkretnie ci się nie zgadza z wynikiem - jakiej konkretnie wartości się spodziewałeś a jaką dostałeś.

Chociaż teraz jak powiedziałeś że chodzi o zaledwie 8 pikseli, to ja byłbym raczej skłonny robić to jednak przez GetPixel(). Powiedz jeszcze tylko jak często musisz pobierać te piksele ("jak najszybciej" nie jest odpowiedzią - chodzi o minimalną częstotliwość przy jakiej bot będzie spełniał zadanie) i w jakim one są układzie (jak daleko od siebie, jaka całkowita powierzchnia).

Offline kolarz3

  • Użytkownik

# Grudzień 13, 2013, 00:27:22
481, 287
957, 291
488, 530
958, 530
412, 325
896, 306
410, 570
883, 562
Najlepiej jakby było 30 przejść na sekundę.

Offline Xirdus

  • Redaktor

# Grudzień 13, 2013, 00:53:32
Coś mi się tu bardzo nie zgadza. Wynikiem funkcji GetBValue() powinna być liczba z zakresu 0-255. Niestety nie jestem na tyle doświadczony w WinAPI żeby coś doradzić, poza tym północ goni, więc powiem tylko żebyś posprawdzał, czy na pewno przekazujesz uchwyty z jednej funkcji do drugiej poprawnie, w dobrej kolejności i o zgodnych typach.

Offline kolarz3

  • Użytkownik

# Grudzień 13, 2013, 00:56:42
Tamten problem już rozwiazałem, ale teraz dowiedziałem się że mój wysiłek poszedł na marne.
A jak myślicie, wielowątkowość coś pomoże ?
« Ostatnia zmiana: Grudzień 13, 2013, 01:06:33 wysłana przez kolarz3 »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Grudzień 13, 2013, 01:24:57
Tamten problem już rozwiazałem, ale teraz dowiedziałem się że mój wysiłek poszedł na marne.
A jak myślicie, wielowątkowość coś pomoże ?
Nie sądzę.

Offline kolarz3

  • Użytkownik

# Grudzień 13, 2013, 12:35:24
A ma ktoś jakiś pomysł ??

Offline ArekBal

  • Użytkownik

# Grudzień 13, 2013, 17:50:14
Coś mi się tu bardzo nie zgadza. Wynikiem funkcji GetBValue() powinna być liczba z zakresu 0-255.
To są pozycje tych pikseli jak mniemam, a nie ich wartości.
Tamten problem już rozwiazałem, ale teraz dowiedziałem się że mój wysiłek poszedł na marne.
Jaki problem rozwiązałeś?
Dlaczego na marne i który wysiłek?

Offline kolarz3

  • Użytkownik

# Grudzień 13, 2013, 21:21:37
Tak, współrzędne

Offline Xirdus

  • Redaktor

  • +1
# Grudzień 14, 2013, 02:01:41
Czekaj czekaj - czy ja dobrze rozumiem? Po kiego Wacka podałeś nam współrzędne pikseli które pobierasz? Co mamy se z nimi zrobić, na półce postawić?

Sory, ale trochę pomyślunku. Jeśli chcesz rozwiązać problem, to po pierwsze musisz jasno się wyrażać, tak, żebyśmy mogli cię bez problemu zrozumieć, a po drugie MYŚLEĆ. Myślec co się koduje, myśleć dlaczego może być źle, myśleć, myśleć, myśleć!

Ponawiam więc pytanie - CO DOKŁADNIE nie pasuje ci w wartościach kolorów, które odczytujesz z bitmapy?

Offline kolarz3

  • Użytkownik

# Grudzień 18, 2013, 16:05:27
Wszystko mi pasuje, ale to jest cholernie wolne. A ja muszę to szybciej pobierać.