Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[openGL] Wie kriegt man ein JPEG-Bild in eine Textur rein?
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 01.07.2007, 19:00    Titel: [openGL] Wie kriegt man ein JPEG-Bild in eine Textur rein? Antworten mit Zitat

Hi,
ich brauche einen Algo, der mir ein JPEG in einen FB-Puffer gibt, und es vorher skaliert; bis jetzt habe ich immer diesen hier verwendet:
Code:

Function GetJpeg(Byval File As String, X as integer, Y as integer) As Any Ptr ' Lädt ein JPEG-Bild in einen
Dim Dib As FIBITMAP Ptr                                                       ' FreeBasic-kompatiblen Puffer
Dim SprWidth As Integer
Dim SprHeight As Integer
Dim Sprite As Any Ptr
Dim Bits As Any Ptr

' Ab in den RAM, mit dem JPEG!!!!
Dib = FreeImage_Load(FIF_JPEG, File, JPEG_DEFAULT)
' Und sofort skalieren!!!
Dib = FreeImage_Rescale (Dib, X, Y, 0)
If Dib = 0 Then Return 0

FreeImage_FlipVertical Dib
' Ab hier gehts mit 32 Bit Farbtiefe weiter
Dib = FreeImage_ConvertTo32Bits(Dib)

SprWidth = FreeImage_GetWidth(Dib)
SprHeight = FreeImage_GetHeight(Dib)
Sprite = ImageCreate(SprWidth, SprHeight)
Bits = FreeImage_GetBits(Dib)

MemCpy CPtr(Zstring Ptr, Sprite) + 4, Bits, SprWidth * SprHeight * 4

' Speicher wieder freigeben
FreeImage_Unload(Dib)

Return Sprite

End Function


aber das ist bei 5 megapixel großen bildern seeeeehhhr langsam, da dauert das schonmal 2-4 Sekunden.

kennt jemand eine schnellere alternative?
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick


Zuletzt bearbeitet von csde_rats am 03.07.2007, 17:18, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 01.07.2007, 19:27    Titel: Antworten mit Zitat

Kleine Sache am Rande:
Code:
Dib = FreeImage_Rescale (Dib, X, Y, 0)

Skalierst du unabhängig von der Ausgangsgröße? Ich würde erstmal prüfen, ob das überhaupt nötig ist.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 01.07.2007, 19:34    Titel: Antworten mit Zitat

ja es ist nötig zwinkern

ich weiß nämlich genau, dass jedes bild 2048x1536 pixel groß ist zwinkern
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 02.07.2007, 14:17    Titel: Antworten mit Zitat

kennt jemand denn einen skalieralgo, der recht schnell ist für den FB-Bildpuffer?
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.07.2007, 14:35    Titel: Antworten mit Zitat

OpenGL... Das macht das dann hardware-seitig, software-seitig ist das skalieren von großen bildern IMMER langsam...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 02.07.2007, 14:54    Titel: Antworten mit Zitat

also beim screen modus opengl angeben?
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 02.07.2007, 15:23    Titel: Antworten mit Zitat

sry für den doppelpost, aber:

ich bin jetzt soweit mit dem algo:
Code:

Function RawJpeg(Byval File As String, X as integer, Y as integer) As Any Ptr ' Lädt ein JPEG-Bild in einen
Dim Dib As FIBITMAP Ptr                                                       ' FreeBasic-kompatiblen Puffer
Dim SprWidth As Integer                                                       ' und skaliert es auf die angegebene
Dim SprHeight As Integer                                                      ' X und Y Größe
Dim Sprite As Any Ptr
Dim Bits As Any Ptr

dim xcounter as integer
dim ycounter as integer

dim xscale as integer
dim yscale as integer

' Ab in den RAM, mit dem JPEG!!!!
Dib = FreeImage_Load(FIF_JPEG, File, JPEG_DEFAULT)
If Dib = 0 Then Return 0

FreeImage_FlipVertical Dib
' Ab hier gehts mit 32 Bit Farbtiefe weiter
Dib = FreeImage_ConvertTo32Bits(Dib)

SprWidth = FreeImage_GetWidth(Dib)
SprHeight = FreeImage_GetHeight(Dib)
Sprite = ImageCreate(SprWidth, SprHeight)
Bits = FreeImage_GetBits(Dib)

' Berechne, wieviele Pixel im Quellbild einen Pixel im Zielbild entsprechen
xscale = SprWidth / X
yscale = SprHeight / Y
' Ab hier habe ich k.A. wies weitergehen soll

MemCpy CPtr(Zstring Ptr, Sprite) + 4, Bits, X * Y * 4

' Speicher wieder freigeben
FreeImage_Unload(Dib)

end function


wie man sieht, habe ich vor, nicht FreeImage skalieren zu lassen, sondern das Bild von FB in einem FB-Puffer skalieren zu lassen. Ganz unten, wo ich einen entsprechenden Kommentar eingefügt habe, habe ich keine Ahnung was ich jetzt machen soll (peinlich).
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 02.07.2007, 15:32    Titel: Antworten mit Zitat

*Ich* würde den Farbdurchschnitt der umliegenden Pixel errechnen. zwinkern
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.07.2007, 15:39    Titel: Antworten mit Zitat

@csde: nein, nicht das ogl-flag, sondern wirlklich die gl.bi und glu.bi includen und nen GL-Screen erstellen...

@mao: Nächster Nachbar also? is aber net die schönste methode happy
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 02.07.2007, 16:12    Titel: Antworten mit Zitat

kann mir _irgendjemand_ einfach mal erklären wie man sowas macht!?
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.07.2007, 16:29    Titel: Antworten mit Zitat

Für sowas gibt's Tutorials... z.B. Stormys OGL-2D-Tutorial. ist wirklich verständlich und einfach erklärt.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 03.07.2007, 15:10    Titel: Antworten mit Zitat

hmmm


ok

wie kriege ich aber ein jpg-bild in eine ogl textur rein?
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 03.07.2007, 17:48    Titel: Antworten mit Zitat

Hier ein möglicher Weg: (entnommen aus gfxlib.txt)

Voraussetzung: ein fb-tauglicher Bildbuffer (den du über deine JPEG-Ladefunktion bekommst)

Code:
   #DEFINE TEX_MASKED      &h1
   #DEFINE TEX_MIPMAP      &h2
   #DEFINE TEX_NOFILTER      &h4
   #DEFINE TEX_HASALPHA      &h8
   
   FUNCTION CreateTexture( BYVAL buffer AS ANY PTR, BYVAL flags AS INTEGER _
                     = 0 ) AS GLuint
      REDIM dat(0) AS UBYTE
      DIM p AS UINTEGER PTR, s AS USHORT PTR
      DIM AS INTEGER w, h, x, y, col
      DIM tex AS GLuint
      DIM AS GLenum format, minfilter, magfilter
      
      CreateTexture = 0
      
      s = buffer
      w = s[0] SHR 3
      h = s[1]
      
      IF( (w < 64) OR (h < 64) ) THEN
         EXIT FUNCTION
      END IF
      IF( (w AND (w-1)) OR (h AND (h-1)) ) THEN
         '' Width/height not powers of 2
         EXIT FUNCTION
      END IF
      
      REDIM dat(w * h * 4) AS UBYTE
      p = @dat(0)
      
      glGenTextures 1, @tex
      glBindTexture GL_TEXTURE_2D, tex
      
      FOR y = h-1 TO 0 STEP -1
         FOR x = 0 TO w-1
            col = POINT(x, y, buffer)
            '' Swap R and B so we can use the GL_RGBA texture format
            col = RGBA(col AND &hFF, _
                    (col SHR 8) AND &hFF, _
                    (col SHR 16) AND &hFF, _
                    col SHR 24)
            IF( flags AND TEX_HASALPHA ) THEN
               *p = col
            ELSE
               IF( (flags AND TEX_MASKED) AND _
                     (col = &hFF00FF) ) THEN
                  *p = 0
               ELSE
                  *p = col OR &hFF000000
               END IF
            END IF
            p += 4
         NEXT x
      NEXT y
      
      IF( flags AND ( TEX_MASKED OR TEX_HASALPHA ) ) THEN
         format = GL_RGBA
      ELSE
         format = GL_RGB
      END IF
      
      IF( flags AND TEX_NOFILTER ) THEN
         magfilter = GL_NEAREST
      ELSE
         magfilter = GL_LINEAR
      END IF
      
      IF( flags AND TEX_MIPMAP ) THEN
         gluBuild2DMipmaps GL_TEXTURE_2D, format, w, h, GL_RGBA, _
                       GL_UNSIGNED_BYTE, @dat(0)
         IF( flags AND TEX_NOFILTER ) THEN
            minfilter = GL_NEAREST_MIPMAP_NEAREST
         ELSE
            minfilter = GL_LINEAR_MIPMAP_LINEAR
         END IF
      ELSE
         glTexImage2D GL_TEXTURE_2D, 0, format, w, h, 0, GL_RGBA, _
                      GL_UNSIGNED_BYTE, @dat(0)
         minfilter = magfilter
      END IF
      glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilter
      glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magfilter
      
      CreateTexture = tex
   
   END FUNCTION

_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 03.07.2007, 17:50    Titel: Antworten mit Zitat

DAnke!!!

/€dit:

iwie stürzt er immer ab, sobald ich einen openGL-modi im menü auswähle traurig

http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=39
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick


Zuletzt bearbeitet von csde_rats am 03.07.2007, 20:12, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 03.07.2007, 18:07    Titel: Antworten mit Zitat

Achja.. kleiner Tipp..

das Bild sollte in der Größe (=Höhe sowie Breite) eine 2er-Potenz haben.

Wenn du also Bilder im Format 2048x1536 hast, solltest du also einen 2048x2048 großen Buffer anlegen. Ansonsten dürfte die Performance ziemlich in die Brüche gehen.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 05.07.2007, 20:20    Titel: Antworten mit Zitat

Jo, danke für den Tipp!

Ich weiß ja es klingt blöd - aber - kann da mal jemand rüber' schauen der Ahnung von OGL + FB hat? Denn iwie funzt es net traurig

http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=41
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 05.07.2007, 20:53    Titel: Antworten mit Zitat

csderats hat Folgendes geschrieben:
' Warte bis was passiert
do: sleep 1: puffer = inkey: loop until puffer inkey
kannste mir mal bitte erklären, was hier passieren soll?
..oder ist es einfach nur ein Kopierfehler?
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 05.07.2007, 20:58    Titel: Antworten mit Zitat

im porticula is wohl immer noch der bug, dass <> entfernt wird.. aber selbst mit dem <> macht's keinen sinn.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
csde_rats



Anmeldungsdatum: 07.01.2007
Beiträge: 2292
Wohnort: Zwischen Sessel und Tastatur

BeitragVerfasst am: 05.07.2007, 21:01    Titel: Antworten mit Zitat

Funzt aber happy

die betreffende zeile:
Code:
do: sleep 1: puffer = inkey: loop until puffer <> inkey


noch ein paar infos
Compiler Output hat Folgendes geschrieben:
Command executed:
"C:\Developing\FreeBasic\fbc.exe" "C:\Developing\FreeBasic\ratsjview.bas" -s gui -i inc -l kernel32.dll -l user32.dll -l shell32.dll

Compiler output:
C:/Developing/FreeBasic/ratsjview.bas(506) warning 4(1): Suspicious pointer assignment

Results:
Compilation successful
Generated executable: C:\Developing\FreeBasic\ratsjview.exe

System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.17 (05-11-2007) for win32 (target:win32)
OS: Windows XP (build 2600, Service Pack 2)

_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 06.07.2007, 00:23    Titel: Antworten mit Zitat

Ich werde mir heute Nachmittag deinen source code zu Gemüte führen und ggf. korrigieren.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz