Seite 1 von 2
Point(x,y)?
Verfasst: 14.10.2005 12:26
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?
Re: Point(x,y)?
Verfasst: 14.10.2005 12:54
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!
Verfasst: 14.10.2005 13:39
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.
Verfasst: 19.10.2005 17:06
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.
Verfasst: 19.10.2005 23:42
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
Verfasst: 20.10.2005 00:33
von Deeem2031
inc. hat geschrieben:RGB32 = rot+grün+blau+alpha
Genau, RGB
32. Dann müsste deine Struktur aber auch 32 (bzw 24) bit groß sein und nicht 96 bit
->
Verfasst: 20.10.2005 03:07
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)
Verfasst: 21.10.2005 01:03
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.
Verfasst: 06.11.2005 10:12
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...
Verfasst: 06.11.2005 17:38
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.