Point(x,y)?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
MASH
Beiträge: 130
Registriert: 22.05.2005 17:43

Point(x,y)?

Beitrag von MASH »

Kann mir jemand sagen wie ich diese funktionon "Point" auf ein geladenes image über die loadImage Funktion anwende?

Oder gibt es eine schnellere Alternative?
Danke Mark S.
merlin
Beiträge: 157
Registriert: 30.07.2005 22:15

Re: Point(x,y)?

Beitrag von merlin »

MASH hat geschrieben:Kann mir jemand sagen wie ich diese funktionon "Point" auf ein geladenes image über die loadImage Funktion anwende?

Oder gibt es eine schnellere Alternative?

das müßte so gehen... mal eben hier ohne PB editor geschrieben....

loadimage(0,"name")
useimage(0)
startdrawing(imageoutput())
result = point(20,20) ;x,y, z.b. 20,20
stopdrawing()

in result steht dann der RGB wert... kannst mit RED GREEN BLUE die farben einzlen auswerten!
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Genau richtig.
Das ist allerdings eine extrem lahme Routine. Wenns schneller gehen soll, machs von Hand indem Du via GetDIBits_() die Pixelmap ausliest und darauf direkt zugreifst.

Zum Beispiel so:

Code: Alles auswählen

  hbmp = LoadImage(1,File)
  WIDTH = ImageWidth()
  HEIGHT =ImageHeight()
  Depth=ImageDepth()
  *nBuf = AllocateMemory(WIDTH*HEIGHT*Depth/8)
  hDC  = StartDrawing(ImageOutput())
  bmi.BITMAPINFO
  bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth  = WIDTH
  bmi\bmiHeader\biHeight = HEIGHT
  bmi\bmiHeader\biPlanes = 1
  bmi\bmiHeader\biBitCount = Depth
  bmi\bmiHeader\biCompression = #BI_RGB
  GetDIBits_(hDC,hbmp,0,HEIGHT,*nBuf,bmi,#DIB_RGB_COLORS) 
  StopDrawing()
So bekommst Du eine Kopie des Bildes nach *nBuf kopiert. Lohnt sich natürlich nur, wenn Du viele Punkte auslesen möchtest. Achte auch noch auf das Format beim Auslesen, also wieviel Bit pro Farbwert verwendet wurden.
Optimismus ist ein Mangel an Information.
Benutzeravatar
MASH
Beiträge: 130
Registriert: 22.05.2005 17:43

Beitrag von MASH »

Jo die funktion von Hellhound66 habe ich soweit verstanden nur weis ich noch nicht wie ich jetzt einen farbwert von x/y bestimme.
Danke Mark S.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

RGB32 = rot+grün+blau+alpha

Im Speicher ists so angeordnet: BGRA+BGRA+BGRA .....
Somit "müsstest" du eine Peek-Schleife bauen.
Jeder "Zeilensprung" des Bildes wäre bei y=y*Width (so mal fix ausm Kopf).. (die Zeilenauslesung ist im ZigZack Verfahren).

Aber es gibt dafür auch einen direkten API Befehl der dies inne hat:
GetPixel_()
http://msdn.microsoft.com/library/defau ... s_0rho.asp

Nun weiss ich aber nicht, ob dieser ebenso lahm ist, wie der von Purebasic. Ansonsten suche nach PointFast() hier oder im engl. PB Forum.

Hmm .. so fix aus dem Kopf würde ich mal so rangehen:

Code: Alles auswählen

Structure myRGB
  r.l
  g.l
  b.l
EndStructure

loadimage(0,"name") ;// Ich denke mal so ists breits im Speicher??
useimage(0)
hdc = startdrawing(imageoutput())
result.myRGB = GetPixel_(hdc, 20, 20) ;x,y, z.b. 20,20
stopdrawing()
red = RGB\r
blue = RGB\g
green = RGB\b
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

inc. hat geschrieben:RGB32 = rot+grün+blau+alpha
Genau, RGB32. Dann müsste deine Struktur aber auch 32 (bzw 24) bit groß sein und nicht 96 bit ;)

->

Code: Alles auswählen

Structure myRGB 
  r.b
  g.b
  b.b
EndStructure
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

inc. hat geschrieben: (die Zeilenauslesung ist im ZigZack Verfahren).
wie meinst du das?

afaik steht ne bitmap im speicher ähnlich wie ein 2D-Array.

*geistesblitz*

könnte ich nicht ein array einrichten, und dassen pointer auf die bitmap verbiegen,
um auf die farbwerte der pixel dann direkt aus dem array zuzugreifen?

...oder macht er das nicht, weil das außerhalb seines datensegmentes stünde...
(früher ging so was)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

@ Deeem2031

Yupp genau, ... so gehts wenn man fix ausm Kopf tippt.

genauso wie

red = RGB\r
blue = RGB\g
green = RGB\b

müsste imho lauten

result\r
result\g
result\b

Da ist trotzdem noch ein Bug drin.

"Can't assign a value to a structure" oder so hat der Debugger ausgespuckt.
Hmmm ...


@Kaeru Gaman

Array?

loadimage(0,"name") ; // Ich denke mal so ists breits im Speicher??
useimage(0)
startdrawing(imageoutput())
color = PointFast(x,y) ; // Aus der "E2D" User Library! Musst du mal hier suchen.
stopdrawing()
red = Red(color)
green = Green(color)
blue = Blue(color)


EDIT: PointFast() ist immer noch "unbeaten", selbst GetPixel_() aus der WinAPI ist grotten langsam muss ich feststellen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yap, array...

wenn man ein array erzeugt, und dessen pointer auf die grafik verbiegt,
kann man durch zugriff auf die array-elemente direkt auf die grafik zugreifen.

...früher ging das jedenfalls, aber seit den 16bit zeiten hat sich einiges verändert in sachen zugriffsrechten...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

zickzack und 2d array ist in dem moment das gleiche, denn ein 2d array steht auch "zickzack" im speicher, oder genauergesagt, hintereinander.

mit x+y*zeilenlänge findet man aber leicht die richtige position im speicher.
Antworten