Problem mit GetPixel
-
Hi,
habe mal wieder ein wirklich merkwürdiges Problem. Und zwar habe ich mir eine Funktion geschrieben, die ein Rechteck bestimmt, in dem etwas gezeichnet wurde. Dies mach ich mit GetPixel (alles was nicht weiß ist zählt als bemalt).
GetPixel liefert mir allerdings immer CLR_INVALID, wenn ich Variablen für die x und y Koordinaten angebe, statt direkt Zahlen anzugeben. Geb ich allerdings direkt Zahlen ein, z.B. 100,200 funktioniert alles. am HDC kanns also nicht liegen... Naja, schaut euch mal meine Funktion an, oder postet eine möglichkeit, wie man das Rechteck ermitteln kann, in dem bisher gezeichnet wurde.//Parameter sind Varaiablen, die das Client Rect beschreiben void GetRectangle (int min_x,int min_y ,int max_x,int max_y) { int real_x=0,real_y=0; COLORREF color; int x,y; x = min_x; y = max_x; while (x<=max_x) { while (y<=max_y) { color = GetPixel (bufferhdc,x,y); if (color == CLR_INVALID) goto END; else if (color!=RGB(255,255,255)) { real_x = x; real_y = y; } y++; } x++; y=0; } rx = real_x; //globale Variablen für das Ergebnis ry = real_y; END: if (color == CLR_INVALID) MessageBox (hWnd,"Cannot Read Pixels!","",MB_OK); }Danke im voraus
-
sollte y nicht so aussehen

y = min_y;
-
jaja, tippfehler von mir
aber funzt trotzdem nicht
-
Wo hast du das mit 100,200 eingesetzt? Was willst du als Rückgabe? So wie du es hast kann ja nur ein Pixel zurückgegeben werden

-
bei welchen werten bricht er denn ab? sind deine parameter-werte, die du an die funktion übergibst, auch gültig im hdc?
-
@flenders für x und y, und die Funktion funktioniert ja, wenn ich ihr statt Variablen Werte übergebe...
ich will ja jedes einzelne Pixel auf seine Farbe überprüfen, damit ich weiß, welche Pixel bemalt sind und welche nicht (für die Größe der Bitmap zum Speichern notwendig, geb ich da nämlich das ClientRect an, macht er mir alles Schwarz,was nicht bemalt wurde! PS: Ist die Funktion SaveBitmap aus der FAQ!)
Gibts da auch ne Windows Funktion die ein Rechteck zurückgibt, welches den bemalten Bereich beschreibt? Wenn nicht muss man das ja so machen, oder?
-
Irgendwie verstehe ich dein Problem nicht so ganz

Also eigentlich dürfte er nichts schwarz machen, was im Fenster eigentlcih weiß ist. Und bemalt ist ja eigentlich jeder Pixel - nur manche eben weiß
-
...und könntest Du bitte das in den Augen schmerzende GOTO wegmachen?
//Parameter sind Varaiablen, die das Client Rect beschreiben void GetRectangle (int min_x,int min_y ,int max_x,int max_y) { int real_x=0,real_y=0; COLORREF color; int x,y; x = min_x; y = min_y; while (x<=max_x) { while (y<=max_y) { color = GetPixel (bufferhdc,x,y); if (color == CLR_INVALID) { MessageBox (hWnd,"Cannot Read Pixels!","",MB_OK); return; } else if (color!=RGB(255,255,255)) { real_x = x; real_y = y; } y++; } x++; y=0; } rx = real_x; //globale Variablen für das Ergebnis ry = real_y; }Dann:
Welche Werte haben x und y denn zur Laufzeit? Setz Breakpoints, frag Deinen Debugger (denn der weiß sowas)...
-
ich denke er hat ein fenster in das er reinmalt und beim speichern ruft er diese funktion auf um die maximale bitmap grösse zu ermitteln. hoffe ich zumindest das es so ist.
-
Ist bufferhdc überhaupt gültig?
-
@miller_m das ist genau richtig!
Die Werte von x und y sind richtig, denn die Funktion liefert ja nur dann einen Fehler, wenn ich statt 200,100 eben x und y einsetzte, also ist bufferhdc gültig!!! Es scheint so als käme GetPixel nicht mit meinen Variablen klar, obwohl diese die richtigen Werte haben!
Wie speichert man denn sonst Bitmaps, wo nur ein Teil bemalt ist? Da ist ja dann auch nicht der ganze Rest schwarz!
-
In eine Fenster ist immer alles bemalt!
-
Wie machen die das in Paint? Wo man den Bereich verändern kann, in dem man malen will?
-
Igendwie werde ich aus deinen Antworten nicht wirklich schlauer

Soll heißen: ich weiß immer noch nicht, wo überhaupt dein Problem liegt
-
vorschlag:
mach doch ein zweites client fenster das der grösse eines vorgegebnen zeichenbereich (320*240 zum beispiel) entspricht und lass nur in diesen bereich etwas reinzeichnen. beim speichern frägst du die aktuelle grösse des fenster ab und somit hast du deine bitmap grösse. die grösse des clientfenster könntest du ja mittels dialog oder sizegripper varieren.
-
was ist sizegripper
-
das ding unten rechts mit dem so ziemlich jedes fenster grösser machen kann

-
Ich denke, er mein sowas hier

edit: zu spät

-
@flenders
diesmal waren die sekunden auf meiner seite

-
sowas nennt man ausgleichende Gerechtigkeit
