Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 01.07.2007, 19:00 Titel: [openGL] Wie kriegt man ein JPEG-Bild in eine Textur rein? |
|
|
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 |
|
 |
Stormy

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

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.07.2007, 14:35 Titel: |
|
|
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 |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 02.07.2007, 15:23 Titel: |
|
|
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 ( ). _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 02.07.2007, 15:32 Titel: |
|
|
*Ich* würde den Farbdurchschnitt der umliegenden Pixel errechnen.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.07.2007, 15:39 Titel: |
|
|
@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  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.07.2007, 16:29 Titel: |
|
|
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 |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
Verfasst am: 03.07.2007, 17:48 Titel: |
|
|
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 |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Stormy

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

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
ytwinky

Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 05.07.2007, 20:53 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.07.2007, 20:58 Titel: |
|
|
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 |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 05.07.2007, 21:01 Titel: |
|
|
Funzt aber
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 |
|
 |
Stormy

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