Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 25.09.2008, 16:38 Titel: Point aus einem Buffer |
|
|
In einen Buffer kann man beispielspielsweise mit
pset buffer,(x,y),RGB(255,255,255)
was reinmalen.
gibts einen befehl womit man diesen pixel bei position (x,y) wieder auslesen kann?
Normalerweise gibts ja die Funktion Point(x,y). Aber den kann man anscheinend nur auf den screen anwenden.
Gibt es eine möglichtkeit die funktion "point" auf einen buffer anzuwenden? |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 25.09.2008, 17:10 Titel: |
|
|
OK, hab mal in der Befehlsreferenz aufm Freebasic-portal geschaut! Da stehts drin!!
x = point(x,y,buffer)
Aber ich hab noch eine frage.. die würd ich dann aber in einem anderen fred stellen.. Trotzdem danke |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.09.2008, 11:16 Titel: |
|
|
Eine weitere Möglichkeit statt Point(x,y) -> Point(er)
x= buffer[(x*pitch)+y+8] _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 26.09.2008, 12:13 Titel: |
|
|
hallo Alle, hallo OneCypher,
möchte noch ne Anmerkung loslassen, die ich in anderen Versuchen entdeckt habe:
Wenn man ein FB-Grafikfenster z.B. in Farbtiefe 16-bit öffnet, und danach ein Grafikbuffer im Ram mit z.B. 32-Bit Farbtiefe, dann können Fehler entstehen, wenn man mit PSET oder POINT auf diesen Ram-Buffer zugreift, weil die beiden scheinbar Screen nach der Farbtiefe fragen (hier dann 16-bit) und mit der Voraussetzung im Ram-Buffer (32-bit) arbeiten.
Bei mir hab ich dann per direkten Ram-Zugriff "buffer[0] buffer[1] buffer[2] buffer[3]" oder so auf den Ram-Buffer zugegriffen.
Drum muß ich nicht nur Volta recht geben, sondern empfehlen, nach dessen Art vorzugehen
u.A. findet Ihr unter:
http://www.freebasic-portal.de/index.php?s=userpage&id=156
eine Vorversion eines Tutorials, in welchem in der Rubrik "Farben umsetzen" genau aufgeführt ist, wie ich auf die einzelnen Farbwerte zugreife. Allerdings dort in einem ImageCreate-Buffer, der hat eine andere "Vorspann"-Größe.
hoffe es hilft
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 26.09.2008, 12:55 Titel: |
|
|
@Volta: Wofür steht die Variable "pitch" ? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 26.09.2008, 12:57 Titel: |
|
|
Referenz hat Folgendes geschrieben: | 'pitch' gibt die Anzahl der Bytes pro Zeile an. Der Wert berechnet sich auch für alle Farbtiefen (bpp = 1, 2 oder 4): pitch=(width*bpp+15) AND -16 Wie Sie sehen, wird also jede Bildzeile so aufbereitet, dass die Anzahl der Byte pro Zeile ein Vielfaches von 16 ist. Dies wirkt sich darin aus, dass in fast jedem Bildpuffer einige ungenutzte Bytes vorhanden sind; in Anbetracht der Größe des zur Verfügung stehenden Speichers fallen diese aber gar nicht ins Gewicht. Der Vorteil dieser Methode liegt darin, dass sich der Umgang mit den Bildpuffern optimieren lässt; die heutigen 32bit-Prozessoren bieten 128 Bit - Register (= 16 Byte) die damit optimal angewandt werden können. Einem minimal größeren Speicheraufwand steht also ein spürbar kleinerer Zeitaufwand bei Berechnungen gegenüber. |
_________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.09.2008, 13:08 Titel: |
|
|
ja, genau so..
pitch für ein Image ermittelst du mit
IMAGEINFO buffer,,,,pitch
oder
pitch = buffer[4] (wenn buffer = Integer Ptr)
pitch = cast(integer ptr, buffer)[4] _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 26.09.2008, 13:54 Titel: |
|
|
@JoJo: danke für die schnelle antwort
@Volta: Ok... für IMAGEINFO muss ich erstmal die neueste fb-version installieren.. werd ich auch machen.
Noch eine kurze frage:
ich stoße immer wieder auf eine type namens "fb.image"
Da ich im web auch schon gesucht hab und keine Dokus gefunden hab frag ich hier einfach mal. Hat jemand Dokus zu den eigenschaften von fb.image oder von "fb" ? da scheint sich noch ne menge zu verstecken wovon ich bisher nich viel gehört/gelesen habe! |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.09.2008, 15:04 Titel: |
|
|
Dazu solltest du dir die fbgfx.bi ansehen, darin sind der Namespace fb und Type as Image definiert.
Doks dazu kenne ich leider auch nicht, nur wenige Beispiele gibt es in den Examples\gfx. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 26.09.2008, 15:40 Titel: |
|
|
Also irgendwas raff ich da nicht.. entschuldigt die ausdrucksweise...
Code: |
screen 19,32
dim img as FB.IMAGE ptr
img = imagecreate( 640, 480 )
|
erstellt einen buffer mit der größe 640x480 pixel und eine farbtiefe von 32 bit.
in der fbgfx.bi steht:
Code: |
type IMAGE field = 1
union
old as _OLD_HEADER
type as uinteger
end union
bpp as integer
width as uinteger
height as uinteger
pitch as uinteger
_reserved(1 to 12) as ubyte
' '' properties
' declare property pixels() as ubyte ptr
end type
|
So wie ich das bisher kannte, speichert man den zeiger der von imagecreate ausgeben wird, in einer "normalen" pointer-variable. Also entweder integer oder any ptr...
Hier wird der pointer aber irgendwie an einen "record?" übergeben..
Nach meinem Verständnis müsste man den pointer der von imagecreate ausgeben wird doch an eine eigenschaft des records "img" übergeben werden... |
|
Nach oben |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 26.09.2008, 17:27 Titel: |
|
|
hallo alle, hallo OneCypher
ich versuch mal das, was ich schon mal getestet hatte, hier zu erstellen:
Code: |
DIM AS INTEGER PTR RamZeiger
DIM AS Byte PTR PixelZeiger
DIM AS UBYTE PixelBlauWert, PixelGruenWert, PixelRotWert, PixelAlphaWert
DIM AS UINTEGER PixelKopie
RamZeiger=ImageCreate( 640, 480, 0, 32) :'Schwarze Farbe, 32-Bit tiefe)
Bload "meineBitmap.bmp" RamZeiger
PixelZeiger=RamZeiger + LEN(FB.IMAGE)
'Beispiel die Farbwerte des ersten Pixels im Bild holen
PixelBlauWert=PixelZeiger[0]
PixelGruenWert=PixelZeiger[1]
PixelRotWert=PixelZeiger[2]
PixelAlphaWert=PixelZeiger[3]
PixelKopie=RGBA(PixelRotWert, PixelGruenWert, PixelBlauWert, PixelAlphaWert)
'Beispiel ein beliebiges Pixel holen:
DIM AS UINTEGER PixelJeZeile
' BildTiefe wäre RamZeiger[1]*8 :'FB hat Tiefe in Bytes, normal = in pixel = X 8
' BildBreite wäre RamZeiger[2]
' BildHoehe wäre RamZeiger[3]
PixelJeZeile = RamZeiger[4] :' = PitchWert im Ram auslesen
PixelBlauWert=PixelZeiger[ (YPos*PixelJeZeile) + XPos + 0 ]
PixelGruenWert=PixelZeiger[ (YPos*PixelJeZeile) + XPos + 1 ]
PixelRotWert=PixelZeiger[ (YPos*PixelJeZeile) + XPos + 2 ]
PixelAlphaWert=PixelZeiger[ (YPos*PixelJeZeile) + XPos + 3 ]
PixelKopie=RGBA(PixelRotWert, PixelGruenWert, PixelBlauWert, PixelAlphaWert)
|
!!CODE AUS GEDÄCHNTNIS, NICHT GETESTET!!
hoffe, du kannst damit was anfangen
Eastler _________________ Kaum macht mans richtig, schon geht's |
|
Nach oben |
|
 |
|