Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 23.09.2007, 17:18 Titel: Brauche dringend Hilfe beim JPEG-Laden! |
|
|
Hi!
Ich hab das große problem, dass egal welche library ich benutze (freeimge oder jpeglib) es zu keiner darstellung eines bildes kommt!
Da die DLLs bei den FreeBasic-Beispielen gefehlt haben, habe ich sie aus dem Internet geladen und in die jeweiligen Verzeichnisse hinzugefügt. Nun beschwert sich kein Programm beim start mehr über eine fehlende DLL, aber es kommt auch zu KEINER bildausgabe!
Habe sowohl http://www.freebasic.net/wiki/wikka.php?wakka=FreeImage als auch das Beispiel unter \FreeBASIC\examples\gfx\freeimage.bas ausprobiert. Hier im Forum hab ich auf anhieb kein ähnliches Problem gefunden. Vielleicht liegts ja irgendwie an den DLLs die ich geladen habe...
( geladen von http://www.freebasic.de/FBdownloads.php?zeig=downloads&detail=userupload/Bibliotheken%20(Libraries)/fbdllpack.ZIP )
Was mache ich falsch??
Vielen Dank schon mal! |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 23.09.2007, 19:15 Titel: |
|
|
Hallo,
welche Compilerversion verwendest du? Das kannst du herausfinden, indem du die Eingabeaufforderung (cmd.exe) startest und da Folgendes eingibst:
Code: | C:\<PfadZuDeinerFBInstallation>\fbc.exe -version |
Wenn die Versionsnummer unter 0.17 liegt (z.B. 0.14 ), solltest du dir dringlichst eine aktuellere Version beschaffen. Wie das geht wird in einem Tutorial beschrieben.
Hast du auch mal die aktuellen Binärdateien der Bibliotheken ausprobiert? Die Datei, die du von fb.de hast, könnte veraltete Versionen der DLLs enthalten.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 23.09.2007, 19:55 Titel: |
|
|
Dann sagt er mir:
FreeBASIC Compiler - Version 0.17 (05-11-2007) for win32 (target:win32)
Copyright (C) 2004-2007 The FreeBASIC development team.
Also ists schon relativ aktuell.
die Freeimage.dll ist frisch von sourceforge runtergeladen.
Die jpeg622.dll hat laut Datei-Eigenschaft die version 6.2.1387.21066
.. Tja.. ich bin "eigentlich" kein newbie was programmieren in basic angeht. aber mit DLLs wurd ich bisher nicht konfrontiert. Hab immer lieber mit den internen oder selbstprogrammierten funktionen gearbeitet. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 23.09.2007, 20:11 Titel: |
|
|
Hi,
die Freeimage.dll (3.93?) könnte zu 'Neu' sein, da FB erst die Version 3.50 unterstützt.
Code: | #inclib "FreeImage"
#define FREEIMAGE_MAJOR_VERSION 3
#define FREEIMAGE_MINOR_VERSION 5
#define FREEIMAGE_RELEASE_SERIAL 0 |
versuch mal die ältere Version runter zu laden?
Aber mit der jpeg622.dll sollte FB arbeiten können! _________________ 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: 23.09.2007, 20:25 Titel: |
|
|
Folgender Code führt bei mir zu einem rein schwarzen Fenster. Die JPEG-Datei liegt lokal im selben verzeichnis wie die Code und DLL-Dateien. Vielleicht kann einer von euch das programm mal ausprobieren.
Code: | #include once "jpeglib.bi"
const SCR_W = 640
const SCR_H = 480
const SCR_BPP = 32
declare function imageread_jpg( byval filename as zstring ptr, _
byval bpp as integer ) as any ptr
screenres SCR_W, SCR_H, SCR_BPP
dim as any ptr img = imageread_jpg( "b1.jpg", SCR_BPP )
if( img = 0 ) then
end 1
end if
put (0,0), img, pset
sleep
imagedestroy( img )
'':::::
function imageread_jpg( byval filename as zstring ptr, _
byval bpp as integer ) as any ptr
dim as FILE ptr fp = fopen( filename, "rb" )
if( fp = NULL ) then
return NULL
end if
dim jinfo as jpeg_decompress_struct
jpeg_create_decompress( @jinfo )
dim jerr as jpeg_error_mgr
jinfo.err = jpeg_std_error( @jerr )
jpeg_stdio_src( @jinfo, fp )
jpeg_read_header( @jinfo, TRUE )
jpeg_start_decompress( @jinfo )
dim row as JSAMPARRAY
row = jinfo.mem->alloc_sarray( cast( j_common_ptr, @jinfo ), _
JPOOL_IMAGE, _
jinfo.output_width * jinfo.output_components, _
1 )
dim img as any ptr
img = imagecreate( jinfo.output_width, jinfo.output_height )
dim as byte ptr dst = cast( byte ptr, img ) + 4
dim as integer dst_pitch = jinfo.output_width * (bpp shr 3)
do while jinfo.output_scanline < jinfo.output_height
jpeg_read_scanlines( @jinfo, row, 1 )
'' !!!FIXME!!! no grayscale support
imageconvertrow( *row, 24, dst, bpp, jinfo.output_width )
dst += dst_pitch
loop
jinfo.mem->free_pool( cast(j_common_ptr, @jinfo ), JPOOL_IMAGE )
jpeg_finish_decompress( @jinfo )
jpeg_destroy_decompress( @jinfo )
fclose( fp )
function = img
end function |
|
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 23.09.2007, 23:45 Titel: |
|
|
Komisch, scheint wohl ein Fehler zu sein, der NICHT mit FB zu tun hat, oder ich irre mich.
Code: | jpeg_create_decompress(@jinfo) |
Diese Zeile verursacht laut gdb (und meinen tests) den fehler, wieso weiß ich leider nicht, werde mich melden, wenn ich genaueres weiß (vllt. falsche lib-version?)
Edit:
So, es wird mir zu bunt, im wahrsten sinne des wortes, aber die jpeglib will einfach nicht
Also: FreeImage-lib, habe den Code aus der englischen wiki angepasst, und jetzt geht es.
Der Fehler war, dass das Beispiel für den alten imageheader geschrieben ist, allerding war das Bild verzerrt, wenn man einfach die richtigen Offsets eingetragen hat, da fbgfx die "Reihen" der Bilder auffüllt, bis die anzahl der bytes ein vielfaches von 16 ist. Vermutlich aus Performancegründen. Leider ist das bei FreeImage nicht so, aber da im Imageheader gespeichert ist, wieviele bytes eine Zeile tatsächlich enthält(pitch), ist es kein Problem das zu ändern.
http://www.freebasic-portal.de/fbporticula/180 _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 24.09.2007, 10:44 Titel: |
|
|
Ich möchte doch nur eine JPEG-Datei in eine buffer-variable (any ptr) laden ( *schnief* ...
Gibts keine bload alternative für jpegs?
Mehr will ich doch gar nich machen  |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 24.09.2007, 11:40 Titel: |
|
|
@csderats: Genau das funzt ja leider nicht bei mir ( kommt immer nur ein schwarzer bildschirminhalt bei rum!
Hab auch schon verschiedene Bilder in unterschiedlichsten größen und komprimierungsraten ausprobiert... nöx |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 24.09.2007, 15:56 Titel: |
|
|
OneCypher hat Folgendes geschrieben: | Ich möchte doch nur eine JPEG-Datei in eine buffer-variable (any ptr) laden ( *schnief* ...
Gibts keine bload alternative für jpegs?
Mehr will ich doch gar nich machen  |
Hab ich auch nciht behauptet...
Wenn du dir den Code genauer angeguckt hättest, dann würdest du sehen, dass man das jpeg bild laden und nacher mit put zeichnen kann.
Code: |
#include "jload.bi" 'siehe unten
Dim image As Any Ptr 'hier kommt dein Bild rein, stell dir mal vor: Any Ptr, genau wie du willst...
ScreenRes 640, 480, 32
Image = jload(exepath + "/blubber.jpg") 'setzt natürlich voraus, dass blubber.jpg existiert, du kannst aber auch einen anderen namen angeben (was exepath ist kannst du [url=http://www.freebasic-portal.de/index.php?s=ref]nachgucken[/url], wenn du es nicht bereits weißt)
If Image <> 0 Then 'wenn image nicht null ist, dann ist alles in ordnung
Put (0, 0), Image 'das zeichnen jetzt das bild, und ja, image ist immer noch ein "any ptr"
Else
Print "Problem Loading File" 'selbsterklärend...
End If
Sleep 'kannst du auch weglassen, allerdings wirst du dann sehr schnell gucken müssen
|
jload.bi ist hier, den musst du dann runterladen und in jload.bi umbenennen, dann entweder nach FreeBASIC/inc kopieren oder in dem verzeichnis wo dein programm (.bas datei) ist. _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.09.2007, 15:47 Titel: |
|
|
Hi Mchael712,
in der jload.bi (bload für jpegs) sind mir ein paar Sachen aufgefallen:
bei sprite->old.bpp = 32 und sprite->bpp = 32 sollte besser .. = 4 stehen, da dieser Wert Byte per Pixel (nicht Bit per Pixel) angibt.
Du erstellst einen 'new style header' gibst aber keine Kennzeichnung z.B. sprite->style = 7 an.
Und MemCpy @CPtr(UByte Ptr, Sprite)[sizeof(fb.image)], ....
da du immer ein neues Image erstellst könnte man doch MemCpy Cast(UByte Ptr, Sprite) + 32, .... schreiben? _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 26.09.2007, 18:22 Titel: |
|
|
volta hat Folgendes geschrieben: | Hi Mchael712,
in der jload.bi (bload für jpegs) sind mir ein paar Sachen aufgefallen:
bei sprite->old.bpp = 32 und sprite->bpp = 32 sollte besser .. = 4 stehen, da dieser Wert Byte per Pixel (nicht Bit per Pixel) angibt. |
Ok, hast recht, ich dachte, dort wäre bits per pixel angegeben, ich habe mich nach der fbgfx.bi gehalten, und dort nur bpp gelesen, das ist ja nirgends gescheit dokumentiert.
Zitat: |
Du erstellst einen 'new style header' gibst aber keine Kennzeichnung z.B. sprite->style = 7 an. |
Ähm, sorry, aber irgendwie finde ich das nicht:
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
end type
|
Zitat: | Und MemCpy @CPtr(UByte Ptr, Sprite)[sizeof(fb.image)], ....
da du immer ein neues Image erstellst könnte man doch MemCpy Cast(UByte Ptr, Sprite) + 32, .... schreiben? |
Wenn ich dich richtig verstehe:
Wieso sizeof(fb.image) statt 32?
Weil es keinen unterschied macht
Edit:
Etwas weiter unten in der fbgfx.bi steht, dass in neuen headern image.type 7 sein muss... _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.09.2007, 19:53 Titel: |
|
|
hast recht, sieht ja nach Nichts aus!
aber Code: | Cast(UByte Ptr, Sprite) + Asc(" ") | oder besser Code: | @(Cast(UByte Ptr, Sprite)[Asc(" ")]) | ist geil  _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 26.09.2007, 21:17 Titel: |
|
|
genau, lass es uns so kompliziert machen wie möglich
Der Grund, wieso ich sizeof(fb.image) genommen diente eigentlich der Verständnis, denn wenn da 32 stehe, weiß man nicht, wieso es da steht  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.09.2007, 22:30 Titel: |
|
|
ahaa, gute Argumentation!
Dann ist diese Konstruktion:
Code: | @CPtr(UByte Ptr, Sprite)[sizeof(fb.image)] | zum Verständnis das es ein Pointer ist?  _________________ 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: 01.10.2007, 14:31 Titel: |
|
|
Es klappt mittlerweile einigermaßen. Also mit der funktion von Michael712. aber das bild wird trotzdem nicht korrekt dargestellt!!
Am linken rand sind 7 pixel zu viel und rechts 7 pixel zu wenig! mit anderen worten, das bild ist irgendwie 7 pixel zu weit rechts!
Habt ihr eine ahnung woran das nun wieder liegt? |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.10.2007, 14:41 Titel: |
|
|
Nur eine Vermutung: JPEGs bestehen ja bekanntlich aus 8x8-Pixel-Blöcken. Wäre das Bild nun 9x9 Pixel groß, wären vielleicht eben sowohl vertikal aus auch horizontal 7 Pixel Overhead... Versuche einfach mal, die Seitenlängen so zu wählen, dass sie durch 8 teilbar sind, vielleicht behebt es ja dein Problem!  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 01.10.2007, 14:50 Titel: |
|
|
Nein auch wenn ich ein bild mit 320x320 lade ist das bild nicht korrekt. Immer noch zu viele pixel am linken rand und zu wenig am rechten! |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 01.10.2007, 14:54 Titel: |
|
|
STOP! hab genauere beschreibung meines problems:
Es sind genau die pixel die rechts fehlen die links angezeigt werden. das gesamte bild ist einfach nur um 7 pixel nach rechts verschoben. |
|
Nach oben |
|
 |
|