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:

Brauche dringend Hilfe beim JPEG-Laden!
Gehe zu Seite 1, 2  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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 23.09.2007, 17:18    Titel: Brauche dringend Hilfe beim JPEG-Laden! Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 23.09.2007, 19:15    Titel: Antworten mit Zitat

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 durchgeknallt ), 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 23.09.2007, 19:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 23.09.2007, 20:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 23.09.2007, 20:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 23.09.2007, 23:45    Titel: Antworten mit Zitat

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 grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 24.09.2007, 10:44    Titel: Antworten mit Zitat

Ich möchte doch nur eine JPEG-Datei in eine buffer-variable (any ptr) laden traurig( *schnief* ...
Gibts keine bload alternative für jpegs?
Mehr will ich doch gar nich machen böse
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



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

BeitragVerfasst am: 24.09.2007, 11:36    Titel: Antworten mit Zitat

http://www.freebasic-portal.de/index.php?s=tutorials&id=28&seite=1
Code:
dim as any ptr bild
bild=GImage_JPG("lala.jpg")
put(0,0), bild
imagedestroy(bild)
sleep

_________________
If hilfreicher_Beitrag then klick(location.here)

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



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 24.09.2007, 11:40    Titel: Antworten mit Zitat

@csderats: Genau das funzt ja leider nicht bei mir traurig( kommt immer nur ein schwarzer bildschirminhalt bei rum!

Hab auch schon verschiedene Bilder in unterschiedlichsten größen und komprimierungsraten ausprobiert... nöx
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
csde_rats



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

BeitragVerfasst am: 24.09.2007, 11:41    Titel: Antworten mit Zitat

Lade dir mal das runter, da ist eine FI.dll dabei, mit der muss das gehn.
_________________
If hilfreicher_Beitrag then klick(location.here)

Klick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 24.09.2007, 15:56    Titel: Antworten mit Zitat

OneCypher hat Folgendes geschrieben:
Ich möchte doch nur eine JPEG-Datei in eine buffer-variable (any ptr) laden traurig( *schnief* ...
Gibts keine bload alternative für jpegs?
Mehr will ich doch gar nich machen böse


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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 26.09.2007, 15:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 26.09.2007, 18:22    Titel: Antworten mit Zitat

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 Zunge rausstrecken

Edit:

Etwas weiter unten in der fbgfx.bi steht, dass in neuen headern image.type 7 sein muss...
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 26.09.2007, 19:53    Titel: Antworten mit Zitat

hast recht, sieht ja nach Nichts aus!

aber
Code:
Cast(UByte Ptr, Sprite) + Asc(" ")
oder besser
Code:
@(Cast(UByte Ptr, Sprite)[Asc(" ")])
ist geil durchgeknallt
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 26.09.2007, 21:17    Titel: Antworten mit Zitat

genau, lass es uns so kompliziert machen wie möglich durchgeknallt

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 grinsen
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 26.09.2007, 22:30    Titel: Antworten mit Zitat

ahaa, gute Argumentation! grinsen

Dann ist diese Konstruktion:
Code:
@CPtr(UByte Ptr, Sprite)[sizeof(fb.image)]
zum Verständnis das es ein Pointer ist? lachen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 01.10.2007, 14:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 01.10.2007, 14:41    Titel: Antworten mit Zitat

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! zwinkern
_________________
» 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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 01.10.2007, 14:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

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

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
Benutzer-Profile anzeigen Private Nachricht senden
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  Weiter
Seite 1 von 2

 
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